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?
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
.
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.
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.
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.
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.
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.]
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
, ausgibtTags und Links java