Mehrdeutigkeit der Rekursionausgabe

7

Ok, ich lerne gerade Rekursion und bin in einem Punkt verwirrt. Dies ist der Code

%Vor%

Die Ausgabe, die ich bekomme, ist:

%Vor%

Meine Frage ist, warum bekomme ich die Ausgabe " Leaving method. num = 2 ". Sollte es nicht bei " Leaving method. num = 1 " stehen bleiben, da num bereits 1 erreicht hat?

    
armitage 29.07.2011, 02:10
quelle

8 Antworten

7

Sobald der ursprüngliche Aufruf dieser Methode die if-Anweisung verlässt, wird sie an System.out.println("Leaving method. num = " + num); übergeben. Da Sie die Nachricht ursprünglich mit dem Wert 2 aufgerufen haben, ist 2 der Wert von num für diesen Teil des Codes.

Ihr Code läuft so (Pseudocode):

%Vor%

Es sieht so aus, als ob Sie ein grundsätzliches Missverständnis der Rekursion haben. Wenn Sie Ihre Methode mit (num-1) als Argument aufrufen, behält der übergeordnete Aufruf (in diesem Fall der erste Aufruf) den Wert num als Argument bei, in diesem Fall 2 .

    
Zéychin 29.07.2011, 02:14
quelle
6

Also lasst uns die folgende Zeile kommentieren

%Vor%

Was würdest du bekommen? Es muss

sein %Vor%

Und wenn Sie die Zeile oben auskommentieren. Du solltest den bekommen, den du hattest.

    
Tae-Sung Shin 29.07.2011 02:18
quelle
4

Nein.

main ruft showRecursion(2) auf, was wiederum showRecursion(1) aufruft (damit Sie zwei "Entering" -Nachrichten erhalten). An diesem Punkt wird die Bedingung fehlschlagen, so dass keine Rekursion mehr auftritt. Jetzt beginnt das Programm einfach von jedem Funktionsaufruf der Reihe nach zurückzukehren, wobei beide "Leaving" -Nachrichten gedruckt werden.

    
Oliver Charlesworth 29.07.2011 02:15
quelle
3

Das liegt daran, dass der erste Aufruf von showRecursion(2) noch nicht beendet ist.

    
rfk 29.07.2011 02:16
quelle
3

Betrachten Sie Folgendes:

%Vor%

Kein Problem, oder? Sie würden erwarten, die erste eingegebene Methode zu sehen, die zweite eingegebene (dritte nicht eingegeben, da num == 0), zweite links, erste links.

Es gibt wirklich nichts besonderes über Rekursion. Es macht nur einen Funktionsaufruf, der passiert um die Funktion anzurufen, zu der der Anruf gehört. Ein rekursiver Aufruf verhält sich konzeptionell in jeder Hinsicht wie jeder andere Funktionsaufruf. Der Trick ist das Design eines rekursiven Algorithmus , dh mit einem Grund warum Sie die gleiche Funktion aufrufen möchten re schon in.

    
Karl Knechtel 29.07.2011 03:23
quelle
1

Die anderen Antworten decken bereits die spezifische Frage ab, aber hier gibt einige Informationen zur Verwendung eines Debuggers. Dieses Tutorial ist für Eclipse gedacht, sagt Ihnen aber ziemlich genau, was Sie für einen visuellen Debugger wissen müssen.

Die Grundlagen sind ziemlich einfach, und es würde sich lohnen, zumindest zu lernen, wie man den Code durchläuft. Ein Debugger ist ein unschätzbares Werkzeug, um die Logik Ihres Programms schnell zu überprüfen, und ist viel einfacher, als Druckanweisungen überall zu verteilen.

    
Levi Blackstone 30.07.2011 20:29
quelle
1

Versuchen Sie "showRecursion (5);".

[Antwort: Dies ist Rekursion. Es gibt mehr als eine Kopie der Variablen "num" im Speicher. "num" ist ein Parameter; es ist kein Feld und es ist nicht statisch.]

    
Jeff Grigg 02.08.2011 16:42
quelle
0

Also, was ich verstanden habe, war Bei jedem Methodenaufruf wird Stack gefüllt, dh. 2,1 wenn i & gt; 1 jedoch nicht übereinstimmt, gibt es den Aufruf zurück und unterbricht den Aufruf und die Steuerung wird an die Zeile system.out.println gegeben, die den Wert ab dem Anfang des Stapels, dh 1,2

, ausgibt     
leonidas 24.09.2013 02:51
quelle

Tags und Links