Turm von Hanoi-Algorithmus: Python, C++ Code
Was ist der Turm von Hanoi?
Der Turm von Hanoi ist ein mathematisches Puzzle, das aus drei รผbereinander angeordneten Stรคben und zahlreichen Scheiben besteht. Er ist auch als Turm von Brahma oder Lucas-Turm bekannt, da der franzรถsische Mathematiker Edouard Lucas ihn bereits 1883 vorstellte. Dieses Rรคtsel basiert auf Legenden รผber die Bewegung von Goldscheiben zwischen drei Stรคben.
Dieses Puzzle besteht aus drei Stรคben und einer variablen Anzahl gestapelter Scheiben. Diese Stรคbe sind als zyklische Tรผrme konzipiert. Daher werden die Scheiben mit dem grรถรeren Durchmesser unten und die Scheiben mit kleinerem Durchmesser oben gestapelt.
Zunรคchst erhalten wir drei Stifte oder Stangen. Und auf einem von ihnen (A, im Beispiel gezeigt) sind alle Festplatten gestapelt. Unser Ziel ist es, einen ganzen Scheibenstapel von einem Stab (A) zu einem anderen (C) zu bewegen, indem wir bestimmte Regeln befolgen.
Hier ist der anfรคngliche Aufbau des Puzzles:

Und das ist das Endziel-
Regeln des Turms von Hanoi
Hier sind einige wesentliche Regeln fรผr den Turm von Hanoi:
- Im Ausgangszustand dieses Puzzles sind alle Scheiben in Stab eins gestapelt.
- Der Endzustand ist, dass alle Scheiben von Stab eins auf Stab zwei oder Stab drei gestapelt werden.
- Wir kรถnnen eine On-Disk jederzeit von einem Stab zum anderen verschieben.
- Wir kรถnnen nur die oberste Scheibe von der Stange bewegen.
- Eine Festplatte kann nicht รผber eine andere, kleinere Festplatte gelegt werden.
In der ursprรผnglichen Legende ging es um das Verschieben von 64 Scheiben. Den Regeln entsprechend konnten die Priester jeweils eine Scheibe verschieben. Der Legende zufolge gab es eine Prophezeiung, dass die Welt untergehen wรผrde, wenn sie die Tat vollenden kรถnnten. Im Abschnitt zur Zeitkomplexitรคt werden wir zeigen, dass eine Einstellung des Turms von Hanoi mit n Scheiben 2^n โ 1 Bewegung kosten wรผrde.
Wenn die Priester also 1 Sekunde benรถtigen wรผrden, um die Scheiben zu bewegen, wรคre die Gesamtzeit, die sie zum Lรถsen des Rรคtsels benรถtigen wรผrden, 2^64 โ 1 Sekunde oder 584,942,417,356 Jahre, 26 Tage, 7 Stunden und 15 Sekunden.
Algorithmus fรผr den Turm von Hanoi
Eine allgemeine Mรถglichkeit, den Turm von Hanoi zu lรถsen, ist ein rekursiver Algorithmus. Zuerst mรผssen wir uns fรผr zwei Stรคbe oder Stifte als Quelle und Ziel entscheiden, und der Ersatzstift wรคre ein Hilfsmittel oder Helfer.
Hier sind die Schritte, um das Turm-von-Hanoi-Rรคtsel zu lรถsen:
- Verschieben Sie die oberen n-1 Scheiben vom Quellstift zum Hilfsstift.
- Anschlieรend verschieben Sie die n-te Festplatte vom Quell-Peg zum Ziel-Peg.
- Zum Schluss verschieben Sie die restlichen n-1 Festplatten vom Hilfsstift zum Zielstift.
Hinweis: Wenn wir eine einzelne Festplatte haben, kรถnnen wir sie direkt von der Quelle zum Ziel verschieben.
So lรถsen Sie das Turm-von-Hanoi-Rรคtsel
Lassen Sie uns den Algorithmus fรผr drei Festplatten veranschaulichen und betrachten wir Peg A als Quelle, Peg B als Helfer und Peg C als Ziel
Schritt 1) Zunรคchst werden alle Scheiben auf Stift A gestapelt.
In diesem Stadium:
Quelle = Peg A
Ziel = Peg C
Helfer = Peg B
Jetzt mรผssen wir die obersten n-1 Festplatten von der Quelle auf den Helfer verschieben.
Hinweis: Obwohl wir jeweils nur eine Platte verschieben kรถnnen, wird dadurch unser Problem von einem 3-Platten-Problem in ein 2-Platten-Problem umgewandelt, was einen rekursiven Aufruf darstellt.
Schritt 2) Da wir einen rekursiven Aufruf von Peg A aus aufrufen und das Ziel Peg B ist, verwenden wir Peg C als Helfer.
Beachten Sie, dass wir uns wieder bei der ersten Stufe des gleichen Turm-von-Hanoi-Problems fรผr zwei Festplatten befinden.
Jetzt mรผssen wir n-1 oder eine Scheibe von der Quelle zum Helfer verschieben und dabei die kleinste Scheibe von Stift A nach Stift C verschieben.
In diesem Stadium:
Quelle = Stift A
Ziel = Stift B
Helfer = Stift C
Schritt 3) Dann sollte gemรคร unserem Algorithmus der n-te oder 2. Festplattenbedarf in das Ziel oder Peg B รผbertragen werden.
In diesem Stadium:
Quelle = Stift A
Ziel = Stift B
Helfer = Stift C
Schritt 4) Nun verschieben wir gemรคร der dritten Stufe unseres Algorithmus die n-1 Festplatten oder Festplatte eins von Helfer oder Stift C zum Ziel oder Stift B.
In diesem Stadium:
Quelle = Stift A
Ziel = Stift B
Helfer = Stift C
Schritt 5) Nach Abschluss des rekursiven Aufrufs kehren wir in der ersten Stufe des Algorithmus zu unserer vorherigen Einstellung zurรผck.
Schritt 6) Jetzt, in der zweiten Stufe, verschieben wir unsere Quelle zu unserem Ziel, das heiรt, wir verschieben Platte 3 von Stift A auf Stift C.
In diesem Stadium:
Quelle = Stift A
Ziel = Stift C
Helfer = Stift B
Schritt 7) Jetzt kรถnnen wir das sehen
d besteht darin, die verbleibenden Festplatten vom Helfer (Stift B) zum Ziel (Stift C) zu verschieben. In diesem Fall verwenden wir die ursprรผngliche Quelle oder Stift A als Hilfsmittel.
Schritt 8) Da wir nicht zwei Platten gleichzeitig verschieben kรถnnen, fรผhren wir einen rekursiven Aufruf fรผr Platte 1 durch. Gemรคร dem letzten Schritt und unserer Algorithmus, ein Ziel in diesem Schritt ist Stift A.
In diesem Stadium:
Quelle = Stift B
Ziel = Stift A
Helfer = Stift C
Schritt 9) Unser rekursiver Aufruf ist nun abgeschlossen. Dann verschieben wir Datentrรคger 2 von seiner Quelle zu seinem Ziel.
In diesem Stadium:
Quelle = Stift B
Ziel = Stift C
Helfer = Stift A
Schritt 10) Dann verschieben wir unser verbleibendes n-1 oder Laufwerk 1 vom Helfer zum Ziel.
In diesem Stadium:
Quelle = Stift A
Ziel = Stift C
Helfer = Stift B
Pseudocode fรผr den Turm von Hanoi
START
Procedure Tower_Of_Hanoi(disk, source, dest, helper)
IF disk == 1, THEN
move disk from source to dest
ELSE
Tower_Of_Hanoi (disk - 1, source, helper, dest)
move disk from source to dest
Tower_Of_Hanoi (disk - 1, helper, dest, source)
END IF
END Procedure
Programmcode in C++
#include <bits/stdc++.h>
using namespace std;
void tower_of_hanoi(int num, string source, string dest, string helper) {
if (num == 1) {
cout << " Move disk 1 from tower " << source << " to tower " << dest << endl;
return;
}
tower_of_hanoi(num - 1, source, helper, dest);
cout << " Move disk " << num << " from tower " << source << " to tower " << dest << endl;
tower_of_hanoi(num - 1, helper, dest, source);
}
int main() {
int num;
cin >> num;
printf("The sequence of moves :\n");
tower_of_hanoi(num, "I", "III", "II");
return 0;
}
Ausgang
3 The sequence of moves : Move disk 1 from tower I to tower III Move disk 2 from tower I to tower II Move disk 1 from tower III to tower II Move disk 3 from tower I to tower III Move disk 1 from tower II to tower I Move disk 2 from tower II to tower III Move disk 1 from tower I to tower III
Programmcode in Python
def tower_of_hanoi(n, source, destination, helper):
if n==1:
print ("Move disk 1 from peg", source," to peg", destination)
return
tower_of_hanoi(n-1, source, helper, destination)
print ("Move disk",n," from peg", source," to peg", destination)
tower_of_hanoi(n-1, helper, destination, source)
# n = number of disks
n = 3
tower_of_hanoi(n,' A','B','C')
Ausgang:
Move disk 1 from peg A to peg B Move disk 2 from peg A to peg C Move disk 1 from peg B to peg C Move disk 3 from peg A to peg B Move disk 1 from peg C to peg A Move disk 2 from peg C to peg B Move disk 1 from peg A to peg B
Komplexitรคt des Turms von Hanoi
Hier sind die zeitliche und rรคumliche Komplexitรคt des Turms von Hanoi:
1) Zeitliche Komplexitรคt:
Wenn wir auf unseren Algorithmus zurรผckblicken, kรถnnen wir erkennen, dass wir zweimal einen rekursiven Aufruf fรผr (n-1) Festplatten einfรผhren. Diese rekursiven Aufrufe fรผr (n-1) Festplatten kรถnnen in andere ((n-1)-1) usw. zerlegt werden, bis nur noch eine Festplatte bewegt werden kann.
Fรผr drei Festplatten-
- Datentrรคger 3 ruft zweimal eine rekursive Funktion fรผr Datentrรคger zwei auf.
- Datentrรคger 2 ruft zweimal eine rekursive Funktion fรผr Datentrรคger eins auf.
- Scheibe 1 kann sich innerhalb einer konstanten Zeit und Zeit bewegen, um drei Scheiben zu lรถsen.
= 2*(Zeit zum Lรถsen zweier Scheiben) + konstante Zeit zum Verschieben von Scheibe 3
= 2*(2*Zeit zum Lรถsen einer Scheibe + konstante Zeit zum Verschieben von Scheibe 2) + konstante Zeit zum Verschieben von Scheibe 3
= (2*2) (konstante Zeit zum Bewegen von Scheibe 1) + 2*konstante Zeit zum Bewegen von Scheibe 2 + konstante Zeit zum Bewegen von Scheibe 3
Fรผr n Festplatten kann es geschrieben werden als โ
(2n-1 * konstante Zeit zum Bewegen von Scheibe 1 + 2n-2 * konstante Zeit zum Bewegen von Scheibe 2 + โฆ.
Dieser geometrische Verlauf fรผhrt zu O(2n-1oder O (2n), was exponentiell ist.
2) Raumkomplexitรคt
Die Speicherkomplexitรคt des Turms von Hanoi betrรคgt 0(n). Das liegt daran, dass wir die Reihenfolge der Platten speichern mรผssen. Wenn wir die Rekursion verwenden, verwenden wir den Stapel. Und die maximale Grรถรe des Stapels kann โnโ sein. Deshalb wird die Speicherkomplexitรคt O(n).









