Türme von Hanoi |
Björn unregistriert
![](images/spacer.gif) |
|
Meine Frage:
Hi Leute,
ich hätte eine Frage zu den Türmen von Hanoi. Den Code habe ich bereits, allerdings erscheinen mir einige Sachen nicht ganz logisch. Erstmal der Code:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
|
package hanoi;
import java.util.Scanner;
public class Hanoi
{
public static void main(String[] args)
{
int n;
Scanner read = new Scanner (System.in);
System.out.println("Wie viele Scheiben?");
n = read.nextInt();
hanoi(n,'A','B','C');
}
static void hanoi (int n, char x, char y, char z)
{
if (n==1)
{
System.out.println("Scheibe "+n+" von " +x+ " nach " + y);
}
else
{
hanoi(n-1,x,z,y);
System.out.println("Scheibe "+n+" von " +x+ " nach " + y);
hanoi (n-1,z,y,x);
}
}
}
|
|
Meine Ideen:
Meine Frage jetzt: Wie genau läuft die Rekursion im else-Zweig ab?
Vielen Dank
|
|
23.04.2015 07:07 |
|
|
|
Das Programm arbeitet so:
Wir haben einen Turm aus mehreren Scheiben, die alle auf Stapel x liegen.
Alle bis auf die unterste (des aktuellen Teilstapels, der nicht dem Gesamtstapel entsprechen muss) werden nach z geschoben. Dadurch ist auf y Platz für die unterste Scheibe. Die restlichen können dann von z, wo sie zwischengeparkt wurden, auch nach x.
__________________ Syntax Highlighting fürs Board (Link)
|
|
23.04.2015 16:00 |
|
|
Björn unregistriert
![](images/spacer.gif) |
|
Danke für die Antwort. Allerdings leuchtet mir die Rekursion immer noch nicht ganz ein. Könntest du mir das vielleicht Schritt für Schritt erklären? (2 oder 3 Scheiben vollkommen ausreichend, sonst sind es ewig viele Schritte)
|
|
23.04.2015 19:58 |
|
|
Björn unregistriert
![](images/spacer.gif) |
|
|
25.04.2015 19:25 |
|
|
Tina_92 unregistriert
![](images/spacer.gif) |
|
Ich klinke mich hier einmal in dieses Problem ein, da ich es nicht ganz verstehe: Annahme, dass n=3, x=A, y=B und z = C
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
static void hanoi (int n, char x, char y, char z)
{
if (n==1)
{
System.out.println("Scheibe "+n+" von " +x+ " nach " + y);
}
else
{
hanoi(n-1,x,z,y);
System.out.println("Scheibe "+n+" von " +x+ " nach " + y);
hanoi (n-1,z,y,x);
}
}
|
|
Wie sehe ich den Ablauf:
n = 3;
Erste if-Abfrage wird geprüft --> false, also springt der Compiler in den else-Zweig. Hier heißt die rekursive Funktion jetzt:
Dann startet der Aufruf wieder von vorne, n ist ungleich eins, somit wieder in den else - Zwei. Der Aufruf lautet:
Jetzt ist n==1, somit erfolgt die Ausgabe
Scheibe 1 von A nach B und die Funktion hanoi schließt sich, also lautet die nächste Ausgabe
Scheibe 2 von ...........
Nur weiß ich absolut nicht, wie sich meine chars x,y und z während des rekursiven Aufrufes verhalten. Das mit n ist mir klar, nur nicht die Buchstaben.
Vielen Dank für jegliche Antwort :-)
|
|
12.11.2015 21:52 |
|
|
Tina_92 unregistriert
![](images/spacer.gif) |
|
Danke für die schnelle Antwort. Wie kann ich denn den Code in NetBeans einzeln durchlaufen?
|
|
12.11.2015 22:29 |
|
|
|
1. rechts auf die Zeilennummer klicken (Breakpoint setzen)
2. Programm im Debug Modus starten (Strg + F5 oder Icon rechts von normalen Ausführen)
3. Es sollten jetzt neue Icons in der Menüleiste erscheinen (Continue, Step into, ...), damit kannst du schrittweise weitergehen.
__________________ Syntax Highlighting fürs Board (Link)
|
|
12.11.2015 22:36 |
|
|
Tina_92 unregistriert
![](images/spacer.gif) |
|
|
12.11.2015 22:42 |
|
|
|