Türme von Hanoi


Die Sage berichtet, daß in einem buddhistischen Tempel bei Hanoi die Mitglieder eines Mönchsordens seit Urzeiten damit beschäftigt seien, eine mühsame, aber für die Welt als Ganzes sehr wichtige Arbeit zu verrichten:

Dort stehen drei Pfosten, auf denen 64 zylindrische Scheiben von jeweils verschiedenem Durchmesser liegen. Anfangs lagen alle Scheiben auf dem ersten Pfosten, und sie sollen auf den dritten Pfosten einzeln umgelegt werden; dabei kann der zweite Pfosten als Zwischenablage verwendet werden, aber es darf nur immer eine kleinere auf einer größeren Scheibe zu liegen kommen.

Wenn diese Arbeit einst vollendet sein wird, ist der Zweck des Weltalls erreicht; die Menschheit wird vom Zwang der ewigen Wiedergeburt erlöst und darf ins Nirvana eingehen.

Das Problem sieht sehr kompliziert aus, vor allem was die dabei nötige Buchhaltung betrifft, und wir wollen die Mönche bei ihrem sehr lobenswerten Werk durch eine Computersimulation unterstützen. Nach längerer Überlegung zeigt sich, daß es nützlich ist, einige Hilfsbegriffe einzuführen:

Aus dieser nunmehr rekursiven Beschreibung der Situation können wir nun den Ansatz einer ebenfalls rekursiven Lösung für den Transport eines Turmes gewinnen: Das Verfahren ist nun leicht auszuprogrammieren:
	TYPE Pfosten = (Anfang, Zwischen, Ende);

	PROCEDURE bewegeTurm(A, Z, E: Pfosten; h: Cardinal);
	BEGIN IF h > 0 (* sonst ist nichts zu tun *)
	      THEN bewegeTurm(A, E, Z, h-1);
	           umlegeScheibe(A, E);
	           bewegeTurm(Z, A, E, h-1)
	      END
	END bewegeTurm;
	
Die Prozedur bewegeTurm  transportiert vom Pfosten A die obersten h Scheiben auf den Pfosten E, und sie verwendet dabei den dritten Pfosten Z als Zwischenspeicher.

Daß das Verfahren terminiert, ist leicht zu sehen: wir können als Größenmaß für das Problem wahlweise die Höhe h oder den Durchmesser des Turmes ansehen, und in beiden Fällen sind die Teilprobleme kleiner. Nicht so leicht zu sehen ist, daß das Verfahren korrekt  ist insoweit, daß dabei immer kleinere Scheiben auf größeren zu liegen kommen. Dies zu beweisen ist Übungsaufgabe; uns kommt es hier auf etwas anderes an, nämlich auf den Aufwand.

Sei A(n) der Aufwand, einen Turm der Höhe n zu bewegen, und c1, c2, c3 irgendwelche Konstanten. Dann kann man aus dem Programm sofort ablesen:

A(n) = 2 * A(n-1) + c1für n > 0, A(0) = c2
Dies ist eine Differenzengleichung, und deren Theorie wird heute kaum noch gelehrt; wir lösen sie hier ad hoc,  durch teilweises Probieren:
A(n) + c1 = 2 * (A(n-1) + c1)
oder mit B(n) = A(n) + c1, A(n) = B(n) - c1:
B(n) = 2 * B(n-1) = c3 * 2**n mit irgend einem Faktor c3
Wenn wir noch B(0) = c3 = A(0)+c1 = c1+c2 verwenden und nach A(n) auflösen, erhalten wir:
A(n) = (c1+c2) * 2**n - c1
also eine extrem schnell wachsende Funktion. Wie schnell die Funktion 2**n wächst, zeigen einige Zahlenbeispiele:
2**10 = 1024 10**3, 2**20 10**6, 2**60 10**18,
und mit 64 Scheiben und nur 10 Sekunden für das Umlegen einer Scheibe kommt man bei ca. 5 Billionen Jahren heraus, was mit "astrophysikalischer Genauigkeit", also etwa in der Größenordnung, die Annahmen der Astronomen über die weitere Lebensdauer der Sonne um den Faktor 20 übertrifft. An der Sage könnte also wohl etwas dran sein, aber derzeit besteht noch kein Anlaß zur Besorgnis.
zurück | Inhalt | Index | vor | Vorlesung

Klaus Lagally, 20. März 2000, 17:41