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 ^^