Türme von Hanoi

Jav

Grünschnabel
Hey Leute,

Ich versuche derzeit mich ein wenig in Java einzulernen. Da die "Türme von Hanoi" anscheinend ein recht gutes Beispiel für Rekursion sind, habe ich mich damit beschäftigt.

Im Internet habe ich eine Menge Codes gefunden, die in etwa so aussehen:

Java:
private static void playHanoi(int n, String from , String other, String to) {
        if (n == 0)
            return;
        if (n > 0)
        playHanoi(n-1, from, to, other);
        System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);
        playHanoi(n-1, other, from, to);

Allerdings möchte ich das Programm nicht Anweisungen ausgeben lassen, sondern Anweisungen ausführen lassen. Habe meinen Code also umgestaltet.

Java:
public void playHanoi(int disks, int from, int to, int other) {
		if (disks == 1) {
			han.move(0, 2);
		} else {
			playHanoi(disks - 1, 0, 2, 1);
			han.move(0, 1);
			playHanoi(disks - 1, 1, 0, 2);


die Zahlen 0,1,2 sind die Indizes der Türme. Dieser Code funktioniert allerdings nicht. Klingt für mich auch irgendwie logisch, da für mich die letzte Zeile
Java:
playHanoi(disks - 1, 2, 0, 1);
wenig Sinn macht. Diese wird im Laufe der Rekursion doch einfach direkt wieder überschrieben, bevor sie überhaupt Wirkung hat ?!

Sitze jetzt schon ne Weile daran und vielleicht sehe ich den Wald vor lauter Bäumen auch nicht :D Im übrigen bin ich auch eher skeptisch, dass so ein kurzer Code hier als Lösung genügt, auch wenn es sich um Rekursion handelt .

Edit: Tut mir leid, dass ich das Thema mal wieder ausgrabe (scheint ja schon oft besprochen worden zu sein), aber ich bin über google einfach nicht schlau draus geworden.
 
Zuletzt bearbeitet:

HonniCilest

Erfahrenes Mitglied
Entschuldige die späte Antwort.
Warum hast du in deinem Code die festen Werte 0,1,2 drin? Variable Werte sind hier ein unbedingtes Muss, sonst verschiebst du immer nur in eine Richtung.

Spiele dir doch im Kopf mal einen Stapel aus 3 Scheiben durch, welchen du vom 1. Stapel zum 3. Stapel verschieben möchtest. Ich nenne sie nun A, B und C wobei A die kleinste Scheibe ist.

Start:
ABC ___ ___
playHanoi(3, 0, 2, 1) "Verschiebe drei Scheiben von links nach rechts."

Die Rekursion sagt nun:
__C _AB ___
playHanoi(2, 0, 1, 2) "Verschiebe zuerst die obersten 2 Platten nach Mitte."

----// Denke dir in der Rekursion C weg, du hast nur noch einen Turm aus 2 Elementen.
----_B? ___ __A
----playHanoi(1, 0, 2, 1) "Um 2 in die Mitte zu legen, lege zuerst die oberste nach Rechts."
----(da disk==1 findet hier nur ein move statt)

----__? __B __A
----move(0 , 1) "Damit du die unterste von den 2 Scheiben in die Mitte legen kannst."

----__? _AB ___
----playHanoi(1, 2, 1, 0) "Und verschiebe dann die Rechte Scheibe in die Mitte.
----(da disk==1 findet hier nur ein move statt)

___ _AB __C
move(0, 2) "Damit du die Unterste von Links nach Rechts legen kannst."

___ ___ ABC
playHanoi(2, 1, 2, 0) "Und lege dann die 2 Scheiben aus der Mitte nach Rechts."

----//siehe oben

Wie du siehst wird beim verschieben des 2er Stapels aus dem other-->to und aus dem to-->other beim ersten Aufruf und aus dem other-->from und aus dem from-->other beim 2. Aufruf.

Der Wechsel der Abbruchbedingung von 0 auf 1 ist legitim.
 
Zuletzt bearbeitet: