Rekursive Fakultät
-
Guten Tag,
ich habe vor kurzem angefangen mit der C++ Programmierung und eine der ersten Übungen ist es eine rekursive Fakultät zu programmieren.
Mein Ansatz sieht so aus:const int fakultaet(const int n) { return( n * fakultaet(n - 1) ); }
Allerdings funktioniert das nicht z.b. für den Wert 10.
Was ist falsch?
-
dein ansatz ist ok.
nur fehlt die abbruchbedingung (es muss immer eine da sein!).const int fakultaet(const int n) { if ( n == 0 ) return 1; else return( n * fakultaet(n - 1) ); }
die klammern bei return sind sehr unüblich.
return n * fakultaet(n - 1);
-
und so als tipp, die funktion ist sau langsam ohne cache.
-
tippgeber schrieb:
und so als tipp, die funktion ist sau langsam ohne cache.
nur so als tip, du verwechselst das mit der fibonacci-funktion. die obige implementierung ist lecker schnell.
-
ooh stimmt
danke volkard
-
volkard schrieb:
die klammern bei return sind sehr unüblich.
Sind sie gar nicht! :xmas2:
-
prosit schrieb:
volkard schrieb:
die klammern bei return sind sehr unüblich.
Sind sie gar nicht! :xmas2:
ok, sie sind seltsamerweise üblich bei wahren meistern und bei manchen zumeist veralteten (zum beispiel daran erkennbar, daß struktogramme vorkommen) C-büchern.
wie die C-bücher dazu kommen, ist mir ein rätsel. die wahren meister sind nur konsequent mit return (0), denn sie sagen auch new(int) und delete(p) und nennen die operatoren new und delete funktionen. warum sollte dann return nicht auch eine funktion sein? und um die return-funktion aufzurufen, braucht man nunmal klammern.
-
volkard schrieb:
und um die return-funktion aufzurufen, braucht man nunmal klammern.
Aber wie ist den das return der return-funktion implementiert? Das gibt ja ein rekursives endlos return
-
hehe schrieb:
Aber wie ist den das return der return-funktion implementiert? Das gibt ja ein rekursives endlos return
return ist eine void-Funktion.
-
Bashar schrieb:
hehe schrieb:
Aber wie ist den das return der return-funktion implementiert? Das gibt ja ein rekursives endlos return
return ist eine void-Funktion.
Aber return muss doch den übergebenen Parameter returnen.
-
volkard schrieb:
ok, sie sind seltsamerweise üblich bei wahren meistern und bei manchen zumeist veralteten (zum beispiel daran erkennbar, daß struktogramme vorkommen) C-büchern.
wie die C-bücher dazu kommen, ist mir ein rätsel. die wahren meister sind nur konsequent mit return (0), denn sie sagen auch new(int) und delete(p) und nennen die operatoren new und delete funktionen. warum sollte dann return nicht auch eine funktion sein? und um die return-funktion aufzurufen, braucht man nunmal klammern."if it looks like a function, it is a function!"
-
volkard schrieb:
die klammern bei return sind sehr unüblich.
Wenn ich mich recht erinnere, warst du es, der mir vor etwa drei Jahren diese Klammern abgewöhnt hatte
-
volkard schrieb:
warum sollte dann return nicht auch eine funktion sein?
weil if, goto, while, usw. auch keine sind.
-
hehe schrieb:
Aber return muss doch den übergebenen Parameter returnen.
Deswegen ist ja return auch keine Funktion, weder void noch sonstwas, sondern rein eine Anweisung auf Compilerebene.
Auf ASM- Ebene sieht das so aus, daß der Compiler beim Funktionsaufruf eine Adresse eines Stückchens reservierten Speichers mitgibt, in das der Rückgabetyp genau hineinpaßt. Die aufgerufene Funbktion klatscht da was rein und gibt ab. return macht genau das, also was von return bis zum Strichpunkt geht, wird ausgewertet und in den Speicher geschrieben, die Typenüberwachung macht der Compiler (bzw. castet automatisch, soweit möglich) und danach erfolgt der prozessorseitige return. Klammern brauchst Du daher nicht, wenn return eine Funktion wäre, müßtest Du sie ja mit return() aufrufen - und das Paradoxon wäre perfekt.
Spätestens ab der Endklammer der Funktion kommt zwangsweise der prozessorseitige return, dann steht halt Schrott im Rückgabewert und es ist Aufgabe des Compilers, da zu protestieren (zumindest eine warning absetzen).
Ich habe jetzt exemplarisch den Output meiner Compiler beschrieben, mit denen ich gerade arbeite, denke aber, daß das wohl immer so implementiert sein dürfte.
Happy new year!
-
quatsch der rückgabewert wird idr inem register reingetan bei x86 eax bei mips v0 usw
-
hehe schrieb:
Bashar schrieb:
hehe schrieb:
Aber wie ist den das return der return-funktion implementiert? Das gibt ja ein rekursives endlos return
return ist eine void-Funktion.
Aber return muss doch den übergebenen Parameter returnen.
Wieso das denn? return muss nur bewirken, dass die Funktion, in der das return steht, den Wert returnt.
-
dombtör schrieb:
quatsch der rückgabewert wird idr inem register reingetan bei x86 eax bei mips v0 usw
Ja klar, paßt da auch ein double rein?
-
Bashar schrieb:
Wieso das denn? return muss nur bewirken, dass die Funktion, in der das return steht, den Wert returnt.
Heute schon ordentlich gezecht
Nein, return macht mehr, es beendet ja auch die Funktion und damit kann es keine Funktion sein.
-
Bashar schrieb:
hehe schrieb:
Bashar schrieb:
hehe schrieb:
Aber wie ist den das return der return-funktion implementiert? Das gibt ja ein rekursives endlos return
return ist eine void-Funktion.
Aber return muss doch den übergebenen Parameter returnen.
Wieso das denn? return muss nur bewirken, dass die Funktion, in der das return steht, den Wert returnt.
Aber return ist doch eine Funktion, also muss die doch return aufrufen um etwas zu returnen.
PS: Das Assemblerzeugs interessiert doch keinen. Wir führen hier eine Endlose-Return-Funktion-Return-Beweisführung-Return-Dings. :p
-
hehe schrieb:
PS: Das Assemblerzeugs interessiert doch keinen. Wir führen hier eine Endlose-Return-Funktion-Return-Beweisführung-Return-Dings. :p
Daß Dich das ASM- Zeugs nicht interessiert, wollte ich auch schon immer wissen, nein, alle hier lechzten geradezu nach diesem Erguß.
Ich habe in meinen Ausführungen natürlich unterschlagen, daß Optimierungen durch den Compiler dazu führen können, daß Register für die Rückgabe herangezogen werden. Bei einer 8- Bit- Akkumaschine sind die Möglichkeiten dazu aber reichlich begrenzt.
So, und zuguterletzt: return gehört zu den Keywords, ist also mitnichten Funktion, dazu bedarf es weder einer Beweisführung noch einer Diskussion.