Genaue Funktionsweise von rekursiven Funktionen
-
Hallo liebe C-Programmierer,
Ich habe mich mit rekursiver Programmierung befasst und hänge an einem kleinen
Punkt fest. Weiter unten ist ein einfaches Standardprogramm ,welches die Fakultät einer Zahl rekursiv, durch Aufruf der Funktion berechnet. Diese Technik
macht Programme kurz und ist daher geschickt, das Programm unten ist auch nicht
besonders schwer zu verstehen, wenn man ersteinmal begriffen hat, dass der compiler zwischen den beiden geschweiften Klammern der Funktion schleifenförmig arbeitet, bis die Abbruchbedingung erreicht ist, welche in der Funktion fakultaet mit "x > 1" gesetzt wurde. Dieser Punkt ist nicht selbstverständlich, da das Codewort "if" in C nicht für Schleifenartige arbeitsweise verwendet wird !?
Desweiteren ist es bei dieser Technik jedoch schwer zu verstehen, wie hier die
Berechnung des Wertes im einzelnen stattfindet ? --- das Programm bekommt die
Anweisung " return x * fakultaet(x-1); " nur in dieser Funktion, aber wo ist der Wert (am Beispiel Fakultat von der Zahl 5 * 4 * 3 * 2 1.Schritt 5*4= 20)
- also der Zwischenwert 20 abgelegt. Es gibt keine Variable, die diesen Wert
aufnimmt... Es existiert nur x . Wenn die Funktion sich immer wieder selbst aufruft ohne zu rechnen, dann aber muss man die Werte des langen Rechenausdrucks irgendwo zwischenespeichern ? Das Programm und die rekursionsartige Vorgehensweise habe Ich verstanden, aber wie soll man sich die Berechnung vorstellen , vielleicht kann mir jemand einen Tip geben ?Programm zur Berechnung der Fakultaet per Rekursion:
#include<stdio.h> //#include<stdlib.h> int fakultaet(int x) { if(x > 1) { return x * fakultaet(x-1); } else { return x; } } int main() { int a = 5; printf("Fakultaet von %d ist %d\n", a, fakultaet(a)); //system("pause"); return 0; }
-
Da steht
fakt(4)=4*fakt(3)
Dazu muss er erst fakt(3) berechnen.
fakt(3)=3*fakt(2)
Dazu muss er erst fakt(2) berechnen.
fakt(2)=2*fakt(1)
Dazu muss er erst fakt(1) berechnen.
fakt(1)=1, steht so im if.
Nu kann er fakt(2)=2*fakt(1) berechnen, nämlich fakt(2)=2*1=2
Nu kann er fakt(3)=3*fakt(2) berechnen, nämlich fakt(3)=3*2=6
Nu kann er fakt(4)=4*fakt(3) berechnen, nämlich fakt(4)=4*6=24.
Inendrin speichert er sehr wohl
Dieses Programm#include <iostream> using namespace std; int fakultaet(int x) { if(x > 1) { return x * fakultaet(x-1); } else { return x; } } int main() { cout<<fakultaet(5)<<'\n'; }
sieht nämlich unter der Haube so aus:
#include <iostream> using namespace std; int ax;//Das Register, in dem normalerweise der Return-Wert //einer Funktion steht. Per Verabredung unter den Programmierern. void fakultaet(int x) { if(x > 1) { fakultaet(x-1); ax = x * ax; goto funktionsende; } else { ax = x; goto funktionsende; } funktionsende:; } int main() { fakultaet(5); cout<<ax<<'\n'; }
-
An dem zweiten Programm von dir wirds klar ... Danke!