Türme von Hanoi rekursiv in Java?
Also, ich habe hier diesen Java-Code, welcher die Türme von Hanoi simuliert:
public class Hanoi {
private static void bewege(char a, char b, char c, int n) {
if (n == 1)
System.out.println("Lege die oberste Scheibe von " + "Turm " + a + " auf Turm " + c + ".");
else {
bewege(a, c, b, n - 1);
bewege(a, b, c, 1);
bewege(b, a, c, n - 1);
}
}
public static void main (String[] args) {
bewege('a', 'b', 'c', 5);
}
}
Ich verstehe alles, außer diesen Teil:
bewege(a, c, b, n - 1);
bewege(a, b, c, 1);
bewege(b, a, c, n - 1);
Was macht der Algorithmus da? Es wäre nett, wenn mir jemand auf die Sprünge helfen könnte.
Danke im Voraus.
2 Antworten
Das mag Dir deutlicher werden, wenn Du den Ablauf (bei gleicher Funktion) änderst:
if (n > 1)
bewege(a, c, b, n-1);
System.out.println("Lege die oberste Scheibe von " +
"Turm " + a + " auf Turm " + c + ".");
if (n > 1)
bewege(b, a, c, n-1);
Eine typische Situation, die zeigt, weshalb man sich über die Namensgebung von Variablen und Methoden Gedanken machen muss:
statt
void bewege (char a, char b, char c, int n)
sollte es besser heißen:
void TransportiereTurm(
String von,
String zwischenablage,
String nach,
int derHoehe)
...
So sollte das ganze leicht deutlich werden.
Folgendes:
bewege(a,c,b,n-1) Die Methode ruft sich selbst mit einer kleineren größe auf.
Im Endeffekt verschiebt sie Deinen Hanoi-Turm außer der untersten platte auf den Stapel b.
bewege(a,b,c,1) Es wird die unterste Platte von a nach c bewegt. Da du davor je alles außer der untersten Platte auf Stapel b gelegt hast ist dies auch möglich.
bewege(b,a,c,n-1) Bewegt den zuvor auf Stapel b gelegten Turm auf die unterste Platte auf Stapel c.
Am Besten spielst du das mal an ein paar Beispielen durch, dann verstehst du es hoffentlich...