Methoden Rekursive Methoden

Boby

Neues Mitglied
Hallo alle miteinander!

Ich habe die Aufgabe gestellt bekommen, die Türme von Hanoi als Programm zu schreiben. Die Theorie hab ich soweit verstanden. Ich bräuchte noch ein kleines bisschen Hilfe beim verstehen des Quellcodes.

Java:
public class RekursionTester {

	/*Methode, die zeigt, wie eine rekursive(rueckfuehrende) Methode
	funktioniert*/
	public static void test(int a){
		//Wenn a 0 ist, gib diesen String aus.
		if (a == 0){
		System.out.println("There is nothing to do.");
		}
		/*Wenn a groesser 0 ist rufe die eigene Methode auf und ziehe bei a - 1 ab.
		 * 
		 */
		else if(a > 0 ){
			test(a - 1);
			System.out.println(a);
		}
		
		
	}
	public static void main(String args[]){
		test(2);
	}

Ich war erst sehr verwundert als mir die Reihenfolge umgedreht angezeigt wurde. Wenn ich [JAVA=42]System.out.println(a);[/code] über [JAVA=42]test(a - 1);[/code] setze, wird es mir richtig angezeigt. Meine frage dazu. Was passiert eigentlich im Hintergrund, dass das Programm am Ende noch einmal in die else if bedingung springt und die Variablen ausgibt?
 
Es wird immer direkt vor dem Sysout verzweigt. Deshalb wird dieser nicht erreicht, bis irgendeine Methode "ausläuft" d. h. bis zum Ende läuft. Dann wird wieder an den Punkt gesprungen, von dem der Interpreter gekommen ist.

Also der Programmablauf bei deinem Beispiel mit a=2 wäre:
ERSTER AUFRUF
a!=0: überspringe if Anweisung
a>0: übergib Methode test() a-1

ZWEITER AUFRUF
a!=0: überspringe if Anweisung
a>0: übergib Methode test a-1

DRITTER AUFRUF
a==0: Gib englischen Text aus
Methode beendet. Gehe zu zweitem Aufruf

ZWEITER AUFRUF
Gib a aus //1
Methode beendet. Gehe zu erstem Aufruf

ERSTER AUFRUF
gib a aus //2
Methode beendet. Gehe zu übergeordneter Methode
 
Hallo alle miteinander!

Ich habe die Aufgabe gestellt bekommen, die Türme von Hanoi als Programm zu schreiben. Die Theorie hab ich soweit verstanden. Ich bräuchte noch ein kleines bisschen Hilfe beim verstehen des Quellcodes.

Java:
public class RekursionTester {

	/*Methode, die zeigt, wie eine rekursive(rueckfuehrende) Methode
	funktioniert*/
	public static void test(int a){
		//Wenn a 0 ist, gib diesen String aus.
		if (a == 0){
		System.out.println("There is nothing to do.");
		}
		/*Wenn a groesser 0 ist rufe die eigene Methode auf und ziehe bei a - 1 ab.
		 * 
		 */
		else if(a > 0 ){
			test(a - 1);
			System.out.println(a);
		}
		
		
	}
	public static void main(String args[]){
		test(2);
	}

Ich war erst sehr verwundert als mir die Reihenfolge umgedreht angezeigt wurde. Wenn ich [JAVA=42]System.out.println(a);[/code] über [JAVA=42]test(a - 1);[/code] setze, wird es mir richtig angezeigt. Meine frage dazu. Was passiert eigentlich im Hintergrund, dass das Programm am Ende noch einmal in die else if bedingung springt und die Variablen ausgibt?

Veranschauliche dir in Textform, was die Methode test macht: Wenn der Parameter (
Code:
a
) 0 ist, wird n
Code:
othing to do
ausgegeben. Wenn nicht wird test mit
Code:
a - 1
aufgerufen. Sprich:

Wenn der Parameter nicht 0 ist, wird 1 davon abgezogen, sonst wird abgebrochen.
Wenn der Parameter nicht 0 ist, wird 1 davon abgezogen, sonst wird abgebrochen.
Wenn der Parameter nicht 0 ist, wird 1 davon abgezogen, sonst wird abgebrochen.
Wenn der Parameter nicht 0 ist, wird 1 davon abgezogen, sonst wird abgebrochen.
Wenn der Parameter nicht 0 ist, wird 1 davon abgezogen, sonst wird abgebrochen.
...
und wenn du jede Runde 1 davon abziehst ist der Parameter eben irgendwann 0.

So, nun zu der Reihenfolge der ausgabe:
Angenommen [c]a = 1[/c]. ich ersetze jetzt mal den aufruf auf test mit dem entsprechenden Quellcode und alle [c]a[c] mit ihren entsprechenden Werten:
Java:
// aufruf: test(1);

if (1 == 0) // false
{
    System.out.println("nothing to do");
}
else if (1 > 0) // true
{
    // test(1 - 1) wird aufgerufen
    if (0 == 0)
    {
        System.out.println("nothing to do");
    }
    else if (0 > 0) // false
    {
        test(0 - 1);
        System.out.println(0);
    }
    // aufruf an test zu ende
    System.out.println(1);
}
 

Zurück
Oben