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:
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.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;
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) = c2Dies 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)Wenn wir noch B(0) = c3 = A(0)+c1 = c1+c2 verwenden und nach A(n) auflösen, erhalten wir:
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
A(n) = (c1+c2) * 2**n - c1also 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.