Der Trick, um das Verständnis der Rekursion ist das Verständnis der Stapel.
ich auf Linie bin 2 in einer Funktion namens main
, alle meine lokalen Variablen in meinem Stack-Frame gespeichert sind:
+------------------+
| main() variables | The stack frame
+------------------+
ich dann fib(3)
nennen, damit der Computer meine aktuelle Position schiebt (EIP) zu Der Stack erstellt dann einen neuen Stack-Frame für fib und fügt diesen hinzu. Ich kann immer nur den oberen Stapelrahmen zuzugreifen:
+------------------+
| fib() n = 5 | Top of stack (current frame)
+------------------+
| EIP: main @ 2,1 |
+------------------+
| main() variables | Bottom of stack
+------------------+
Zeile 4 von fib
, ruft fib
wieder, so dass das gleiche wieder passiert:
+------------------+
| fib() n = 4 | Top of stack
+------------------+
| EIP: fib @ 4,1 |
+------------------+
| fib() n = 5 |
+------------------+
| EIP: main @ 2,1 |
+------------------+
| main() variables | Bottom of stack
+------------------+
Und es tut dies immer wieder als die Funktion wird rekursiv aufgerufen. Der Stapel wächst, bis etwas zurückkehrt. An diesem Punkt wird in Zeile 2 von fib
1 zurückgegeben.Daraufhin wird das obere Stapelrahmen und verwirft sie, gibt sie dann die Ausführung an die Ausführungszeiger gespeichert, und das Programm läuft weiter, wo es
links
+------------------+
| fib() n = 3 | Top of stack
+------------------+
... etc ...
+------------------+
| EIP: main @ 2,1 |
+------------------+
| main() variables | Bottom of stack
+------------------+
Schließlich landen Sie wieder in die aufrufende Funktion aus (oder Sie erhalten einen Stapelüberlauf wie es zu groß wird). Das Wichtigste ist, dass jedes Mal, wenn die Funktion aufgerufen wird, ein neuer Stack-Frame mit all Ihren lokalen Variablen abgerufen wird und Ihre vorherige Position gespeichert wird. Das ist Rekursion.
Das Hauptproblem ist, dass im Unterricht Menschen Rekursion, jeder immer die Fibonacci-Sequenz verwendet, was bedeutet, zwei rekursive Funktionsaufrufe auf einer Zeile. Das ist unnötig verwirrend, da Sie mir sicher zustimmen werden!
Wenn Sie diese fragen, muss es sein, weil Sie nicht verstehen (a) Rekursion oder (b) Was ist die Fibonacci-Serie? Was ist es? – CesarGon
http://www.google.com/search?q=recursion :-) – Anycorn
Ich verstehe, wie der Code funktioniert und verstehen, was Fibonacci-Zahlen sind, auch bekomme ich, dass Rekursion passiert, weil die Funktion sich selbst nennt, kann ich einfach ' Ich finde heraus, warum es funktioniert. – Joseph