Referenz Verständnis - factorial



  • Hallo,

    ich habe mal bisschen mit Referenzen rumprobiert und folgende factorialfunktion geschrieben:

    factorial_1(int&a){
    if(a<=1) return 1; 
    else { 
    a=a-1; 
    return (a+1)*factorial(a );
    }
    

    und

    int factorial_2(int&a){
    if(a<=1) return 1; 
    else return a*factorial(a=a-1);
    }
    

    Factorial_1 berechnet mir das richtige Ergebnis, Factorial_2 gibt immer 1 zurück.
    Kann mir jemand mal diese Sachlage verdeutlichen. Wieso ist das so?
    factorial_1 müsste doch auch fehlerhaft sein, da ich immer ne Referenz übergebe und in jedem Schritt a dekrementiert wird. Am Ende, wenn ich die Multiplikation von a_i auswerte, müssten doch falsche Werte in a stehen?

    Und wieso funktioniert factorial_2 nicht?



  • Es ist nicht festgelegt, in welcher Reihenfolge Unterausdrücke abgearbeitet werden. Anscheinend führt Dein Compiler den rekursiven Funktionsaufruf zuerst aus und multipliziert dann erst das Ergebnis mit dem Wert, der von a referenziert wird (also immer 1).

    Es ist hoffentlich klar, dass Das mit den Referenzen hier überhaupt keinen Sinn macht.



  • Wie krümelkacker bereits gesagt hat sind die Referenzen sinnlos. Wiso überhaupt so kompliziert, machs doch einfach so:

    unsigned long factorial( int n )
    {
    	if( n <= 1 )
    		return 1;
    
    	return n * factorial( n - 1 );
    }
    

    (Habs jetzt nicht getestet, müsste so aber schon stimmen. Eventuell könntst du ja noch hinzufügen, dass n nicht negativ sein soll).

    *Edit
    So, jetzt sollte es gehen. Hatte noch einen peinlichen Fehler drin ^^


Anmelden zum Antworten