2016-11-05 5 views
0

Ich bin neu auf der Website und bin nicht vertraut mit, wie und wo zu posten, also bitte entschuldigen Sie mich. Ich studiere zurzeit Rekursion und habe Probleme, die Ausgabe dieses Programms zu verstehen. Unten ist der Methodenkörper.Rekursion in Java Hilfe

public static int Asterisk(int n) 
{ 
if (n<1) 
return; 

Asterisk(n-1); 

    for (int i = 0; i<n; i++) 
    { 
     System.out.print("*"); 
    } 
    System.out.println(); 
} 

Dies ist die Ausgabe

* 
** 
*** 
**** 
***** 

ist es aufgrund der Tatsache, dass der "Asterisk (n-1)", bevor die Schleife für liegt.

Ich würde denken, dass die Ausgabe

**** 
*** 
** 
* 
+2

Wenn 'System.out.print (" * ");' vor _ 'Asterisk (n-1) aufgetreten ist;', wäre die Ausgabe, was Sie erwarten. – pathfinderelite

+0

So geht die Logik: 'Asterisk (n)' => 'Asterisk (n-1)' => ... => 'Asterisk (0)' => drucke Statements von 'Asterisk (1)' gefolgt von Druckanweisungen von 'Asterisk (2)' gefolgt von ... gefolgt von Druckanweisungen von 'Asterisk (n)'. Im Grunde: 'Asterisk (Asterisk (Asterisk (... Asterisk (1) ...))), wo du' n' geschachtelte Methoden hast. Wenn du Mathematik kennst, weißt du, dass du mit "Asterisk (1)" beginnst und deinen Weg nach draußen gehst. – Gendarme

+0

Bitte vergessen Sie nicht, die beste Antwort zu wählen, wenn Ihnen eine unserer Antworten gefallen hat. –

Antwort

2

Dies ist die Art und Weise Kopf Rekursion funktioniert sein sollte. Der Aufruf der Funktion erfolgt vor der Ausführung anderer Anweisungen. Also, Asterisk (5) ruft Asterisk (4) an, bevor er etwas anderes tut. Dies kaskadiert weiter in serielle Funktionsaufrufe von Asterisk (3) → Asterisk (2) → Asterisk (1) → Asterisk (0).

Jetzt gibt Asterisk (0) einfach zurück, wie es die Bedingung n<1 übergibt. Die Kontrolle geht zurück zu Asterisk (1), der nun den Rest seines Codes ausführt, indem er n = 1 Sterne druckt. Dann übergibt es die Kontrolle an Asterisk (2), die wiederum n = 2 Sterne druckt, und so weiter. Schließlich druckt Asterisk (5) seine n = 5 Sterne und die Funktionsaufrufe enden. Deshalb sehen Sie das Muster der aufsteigenden Anzahl von Sternen.

0

Es gibt zwei Möglichkeiten zum Erstellen von Programmierschleifen. Man verwendet imperative Schleifen, die normalerweise in der Sprache vorkommen (für, während, usw.) und die andere verwendet Funktionen (funktionale Schleifen). In Ihrem Beispiel werden die zwei Arten von Schleifen dargestellt.

Eine Schleife ist das Abrollen der Funktion

Asterisk(int n) 

Dieses Abrollen Rekursion verwendet, wobei die Funktion sich selbst aufruft. Jede Funktionsschleife muss wissen, wann sie aufhören soll, sonst geht sie für immer weiter und sprengt den Stapel. Dies wird als "Stoppbedingung" bezeichnet. In Ihrem Fall ist es:

if (n<1) 
return; 

Es bidirektionale Äquivalenz zwischen Funktionsschleifen und zwingend notwendig, Schleifen (für, während, etc). Sie können jede funktionale Schleife in eine reguläre Schleife umwandeln und umgekehrt.

IMO diese spezielle Übung sollte Ihnen die zwei verschiedenen Möglichkeiten zum Erstellen von Schleifen zeigen. Die äußere Schleife ist funktional (Sie könnten sie für eine for-Schleife ersetzen) und die innere Schleife ist zwingend erforderlich.

0

Denken Sie an rekursive Aufrufe in Form eines Stapels. Ein Stapel ist eine Datenstruktur, die an der Spitze eines Stapels hinzugefügt wird. Eine Analogie aus der realen Welt ist ein Stapel von Gerichten, bei denen das neueste Gericht ganz oben steht. Deshalb fügen rekursive Aufrufe eine weitere Ebene an den Anfang des Stapels, und sobald einige Kriterien erfüllt sind, die weitere rekursive Aufrufe verhindern, beginnt der Stapel sich zu entspannen und wir arbeiten uns wieder zurück zum ursprünglichen Gegenstand (der erste Teller im Stapel) .

Die Eingabe eines rekursiven Verfahren tendiert zu einer Basisfall die der Faktor Beendigung ist und verhindert, dass die Methode aus sich selbst auf unbestimmte Zeit (Endlosschleife) aufruft. Sobald diese Basisbedingung erfüllt ist, gibt die Methode einen Wert zurück, anstatt sich selbst erneut aufzurufen. So wird der Stapel abgewickelt.

In Ihrer Methode ist der Basisfall, wenn $ n < 1 $ und die rekursiven Aufrufe die Eingabe $ n-1 $ verwenden. Dies bedeutet, dass die Methode sich selbst aufruft und jedes Mal $ n $ um 1 verringert, bis $ n < 1 $, d. H. $ N = 0 $. Sobald die Basisbedingung erfüllt ist, wird der Wert 0 zurückgegeben und wir beginnen, die $ for $ -Schleife auszuführen. Aus diesem Grund enthält die erste Zeile einen einzelnen Stern.

Also, wenn Sie die Methode mit einem Eingang 5 laufen, bauen die rekursive Aufrufe einen Stapel von Werten von $ n $ als so

0 
1 
2 
3 
4 
5 

Dann wird dieser Stapel abgewickelt mit oben nach unten, 0, alle der Weg nach unten.