[C++] Wie funktioniert das mit der fakultät berechnen?

Irgendjemand_1

Erfahrenes Mitglied
Hallo, ich habe mal eine Frage.
Bei dieser Funktion
Code:
#include <iostream>
int fak (int val) {
    if (val > 1) {
      return fak(val-1) * val;
    }
}
Wird ja die Fakultät einer Zahl, nehmen wir mal 5 (120), ausgerechnet.
Als ich so eine Funktion mal in PHP gesehen habe, kam mir alles logisch vor, aber hier kam jetzt irgendwie folgende Frage auf:
Warum gibt die Funktion am Ende 120 zurück?
Meiner Meinung nach sollte sie am Ende 2 zurückgeben.
So wie ich das sehe, müsste die Funktion 5*1, 4*1, 3*1, 2*1 rechnen. Nur wie kann sie dann beim letzten Mal (2*1) 120 ausgeben?

Danke schonmal dafür, dass ihr mir die Augen öffnen werdet ;) Vielleicht ist es einfach schon zu spät ... ;)
 
Hi !

Ich denke, daß du bei diesem Beispiel die Rekursion übersiehst ... Die Funktion fak() ruft sich in ihrem Rumpf selber auf !

Beispiel :

Code:
fak(5) = fak(4) * 5

=>fak(5) = fak(3) *  4 * 5
=>fak(5) = fak(2) * 3 *  4 * 5
=>fak(5) = fak(1) *  2 * 3 *  4 * 5
=>fak(5) = 1 *  2 * 3 *  4 * 5

Ist anfangs schwierig zu verstehen, allerdings gibt es dazu im Internet unheimlich viele Beispiele, da die Fakultätsberechnung das Standardbeispiel für Rekursionen ist.

Ansonsten : bei Fragen, fragen ! :)

Krösi
 
Achso, die Returnanweisung wird gar nicht verlassen?
Also direkt nach bzw in dem return wird en Rücksprung gemacht und wenn val bei 1 angekommen ist, gibt es das Ergebnis aus, oder wie?

Ich hab ja kein Problem damit rekursion an sich zu verstehen, so eine art Schleife könnte ich ja auch noch als Funktion schreiben :p Irgendwie bereitet mir das mit der Fakultät schwierigkeiten
 
Hi !

Also in der Return-Anweisung wird die Funtkion fak(x) aufgereufen, die dann je nach dem wieder sich selbst aufruft etc. ( bis val = 1).


>> ...wenn val bei 1 angekommen ist, gibt es das Ergebnis aus, oder wie?

genau !

Ich hab auch länger gebraucht .... ist im ersten Moment nich unbedingt trivial, aber wenn der Groschen einmal gefallen ist... wie Fahrradfahren halt.

Krösi
 
Hi!

Irgendjemand_1 hat gesagt.:
Code:
#include <iostream>
int fak (int val) {
    if (val > 1) {
      return fak(val-1) * val;
    }
}

Wird ja die Fakultät einer Zahl, nehmen wir mal 5 (120), ausgerechnet.

Nein, das wäre Zufall! So wie die Funktion da steht, ist sie fehlerhaft und das Ergebnis hängt vermutlich vom Compiler ab.
Nach dem if Konstrukt fehlt in jedem Fall "return 1;". Denn die Funktion soll ja auch noch etwas definiertes zurückgeben, wenn sie mit val=1 aufgerufen wurde.

Ansonsten wurde ja schon recht schön erklärt, warum die Funktion das tut, was sie tut (wenn sie denn korrekt gewesen wäre). Falls es immer noch nicht klar ist, lies dir mal durch, was ein "Kellerautomat" ist und auch ein Stapel (Stack). Das hilft meiner Meinung nach auch beim Verständnis.

Ich hab mit meinem Kumpel mal ne extrem krasse rekursive Routine gebastelt. Ich glaube, die verstehen wir selbst nicht mehr. Wenn ich die finde, kann ich die ja mal posten. :)

Cheers, Ingo =;->
 
Uups ...

Ingo hat natürlich vollkommen recht .... ;)

Und Kellerautomaten bzw. Stacks können wirklich hilfreich sein. Darauf basierend führt ein Programm nämlich Rekursionen aus.

Man sollte halt nicht unrasiert und verpennt zu solchen Themen Antworten bringen ;)

Krösi
 
Curly060 hat gesagt.:
Hi!



Nein, das wäre Zufall! So wie die Funktion da steht, ist sie fehlerhaft und das Ergebnis hängt vermutlich vom Compiler ab.
Nach dem if Konstrukt fehlt in jedem Fall "return 1;". Denn die Funktion soll ja auch noch etwas definiertes zurückgeben, wenn sie mit val=1 aufgerufen wurde.

Ansonsten wurde ja schon recht schön erklärt, warum die Funktion das tut, was sie tut (wenn sie denn korrekt gewesen wäre). Falls es immer noch nicht klar ist, lies dir mal durch, was ein "Kellerautomat" ist und auch ein Stapel (Stack). Das hilft meiner Meinung nach auch beim Verständnis.

Ich hab mit meinem Kumpel mal ne extrem krasse rekursive Routine gebastelt. Ich glaube, die verstehen wir selbst nicht mehr. Wenn ich die finde, kann ich die ja mal posten. :)

Cheers, Ingo =;->
Naja, aber wer die Fakultät von 1 ausrechnen lassen will ... ;)
Aber ansonsten hast du natürlich Recht. Aber ich wollte ja nur schnell zeigen, was ich meinte, also nicht so tragisch ;)

Mal nach diesem "Kellerautomat" und Stack suchen :)
Und wenn du deine rekusrsive Routine da gefunden hast, kannst du das von mir aus gerne Posten, ich bin aber in C++ noch eher am Anfang, hab mich vorher nur mit PHP (was ich Recht gut kann, finde ich) rumgeschlagen.
 

Neue Beiträge

Zurück