.j
-
.j
-
Du hast zwei Ausgaben, eine vor der Schleife (Ausgabe1), eine nach der Schleife (Ausgabe2).
1. Aufruf von foo, Ausgabe1 schreibt
m = 4, n = 12. Aufruf von foo, Ausgabe1 schreibt
m = 5, n = 33. Aufruf von foo, Ausgabe1 schreibt
m = 6, n = 54. Aufruf von foo, Ausgabe1 schreibt
m = 7, n = 75. Aufruf von foo findet nicht mehr statt, da Schleifenbedingung nicht erfüllt, n++ findet auch nicht statt, daher:
Ausgabe2 aus Aufruf 4 schreibt
m = 7, n = 7Aufruf 4 kehrt zurück in Aufruf 3, n++ tut seinen Dienst
Ausgabe 2 aus Aufruf 3 gibt aus:
m = 6, n = 6und so weiter...
Sollte ich mich irgendwo vertan haben, sollte der Grundgedanke doch aber rausgekommen sein.
-
Ich verstehe nicht, was dieser rekursive Aufruf von foo() soll?
Ist das ein rein experimentelles Programm, oder soll es eine bestimmte
Aufgabe leisten?
-
.j
-
Das sind Ausgaben aus zwei Quellen:
1. Die Ausgaben in Zeile 11, wenn die rekursiven Funktionsaufrufe zurückkehren. Man beachte, dass wenn vorher m > n war, das n in der Schleife vergrößert wurde. Ein Beispiel für solch einen Aufruf ist die Zeile 6 (6,6) deiner Ausgabe, dies ist, was nach der Rückkehr von (7,7) durch die (6,5)-Funktion ausgegeben wird.
2. Beachte, dass die Schleife mehrmals durchlaufen wird. Bei der (5,3)-Funktion aus Ausgabezeile 3 werden sowohl (6,5) (Ausgabezeile 4 bis 7, inklusive Unterfunktionsaufrufe) als auch (6,6) gestartet (Ausgabezeile 8).Um das genauer nachvollziehen zu können, könntest du mal das Programm in einem Debugger laufen lassen. Da kannst du genau nachvollziehen, wie viele Ebenen es gibt und welche Werte m und n in dem unterschiedlichen Ebenen haben.
-
Die Ausgaben m und n entsprechen ja auch nicht den Werten der Variablen.
while(m > n) { foo(m + 1, n + 2); /* m und n werden hier ja nicht veraendert */ n++; }