Turm von Hanoi-Algorithmus: Python, C++ Code

โšก Intelligente Zusammenfassung

Der Turm von Hanoi ist ein klassisches rekursives Puzzle, bei dem ein Stapel Scheiben zwischen drei Stรคben hin und her bewegt wird, wobei niemals eine grรถรŸere Scheibe auf eine kleinere gelegt wird. Dies veranschaulicht das Prinzip โ€žTeile und herrscheโ€œ deutlich.

  • ๐Ÿ—ผ Puzzle-Setup: Drei Stifte und n Scheiben sind in abnehmender GrรถรŸe auf dem Quellstift gestapelt und warten darauf, mithilfe eines Hilfsstifts zum Zielstift bewegt zu werden.
  • ๐Ÿ“œ Regeln: Es kann immer nur eine Scheibe bewegt werden, nur die oberste Scheibe eines jeden Stifts kann sich bewegen, und eine grรถรŸere Scheibe kann nicht auf einer kleineren Scheibe ruhen.
  • ๐Ÿ” Rekursive Idee: Bewege n-1 Scheiben auf den Hilfsstift, bewege die grรถรŸte Scheibe auf den Zielstift und bewege dann die n-1 Scheiben vom Hilfsstift zum Zielstift.
  • ๏ธ Zeitliche Komplexitรคt: Das Lรถsen von n Scheiben erfordert 2^n โ€“ 1 Zรผge, was zu einer exponentiellen Zeitkomplexitรคt von O(2^n) fรผhrt, die mit zunehmendem n sehr schnell ansteigt.
  • ๐Ÿง  Raumkomplexitรคt: Der Rekursionsstapel kann bis zu n Frames gleichzeitig speichern, daher betrรคgt die Speicherkomplexitรคt der rekursiven Lรถsung O(n).
  • ๏ธ Anwendungen: Vermittlung von Rekursion, Backup-Rotationsverfahren, stackbasierter Datenbewegung, Robotersequenzierung und Verstรคndnis des Divide-and-Conquer-Algorithmusdesigns.

Turm von Hanoi-Algorithmus

Was ist der Turm von Hanoi?

Der Turm von Hanoi ist ein mathematisches Rรคtsel, bestehend aus drei Stรคben und einem Stapel von Scheiben abnehmender GrรถรŸe, die รผbereinander gestapelt sind. Er ist auch als Turm von Brahma oder Lucas-Turm bekannt, da der franzรถsische Mathematiker ร‰douard Lucas ihn 1883 einfรผhrte. Das Rรคtsel basiert auf Legenden รผber das Verschieben von Goldscheiben zwischen drei Stรคben.

Dieses Puzzle besteht aus drei Stรคben und einer variablen Anzahl gestapelter Scheiben. Die Stรคbe sind wie kreisfรถrmige Tรผrme angeordnet, wobei die grรถรŸeren Scheiben unten und die kleineren Scheiben oben gestapelt sind.

Zunรคchst erhalten wir drei Stรคbe oder Stangen. Auf einem davon (im Beispiel Stab A) sind alle Scheiben gestapelt. Ziel ist es, den gesamten Stapel unter Einhaltung bestimmter Regeln von Stab A auf Stab C zu bewegen.

Hier ist der Ausgangsaufbau des Puzzles:

Turm von Hanoi-Problem

Turm von Hanoi-Problem

Und das ist das Endziel:

Tรผrme von Hanoi

Regeln des Turms von Hanoi

Hier sind die wichtigsten Regeln fรผr den Turm von Hanoi:

  • Im Ausgangszustand des Puzzles sind alle Scheiben auf Stab eins gestapelt.
  • Im Endzustand sind alle Scheiben von Stab eins auf Stab zwei oder Stab drei gestapelt.
  • Es kann immer nur eine Scheibe von einem Stab zum anderen wandern.
  • Nur die oberste Scheibe auf einer Stange kann bewegt werden.
  • Eine Scheibe kann nicht auf eine kleinere Scheibe gelegt werden.

Die ursprรผngliche Legende handelte vom Bewegen von 64 Scheiben. Die Priester durften gemรครŸ den Regeln jeweils eine Scheibe bewegen. Der Legende zufolge prophezeite man, dass die Welt untergehen wรผrde, wenn ihnen dies gelรคnge. Im Abschnitt zur Zeitkomplexitรคt zeigen wir, dass ein Turm von Hanoi mit n Scheiben 2^n โ€“ 1 Bewegungen erfordert.

Wenn die Priester also 1 Sekunde benรถtigten, um eine Scheibe zu bewegen, wรผrde die Gesamtzeit zur Lรถsung des Rรคtsels 2^64 โ€“ 1 Sekunden betragen, also ungefรคhr 584,942,417,356 Jahre, 26 Tage, 7 Stunden und 15 Sekunden.

Algorithmus fรผr den Turm von Hanoi

Die gebrรคuchlichste Methode zur Lรถsung des Turms von Hanoi ist ein rekursiver Algorithmus. Zuerst wรคhlt man zwei Stรคbe als Start- und Zielstab; der รผbrige Stab dient als Hilfsstab.

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.
  • Verschiebe die n-te Scheibe vom Quellstift zum Zielstift.
  • Verschiebe die verbleibenden n-1 Scheiben vom Hilfsstift zum Zielstift.

Hinweis: Wenn wir nur eine Festplatte haben, kรถnnen wir sie direkt von der Quelle zum Ziel verschieben.

So lรถsen Sie das Turm-von-Hanoi-Rรคtsel

Wir wollen den Algorithmus anhand von drei Scheiben veranschaulichen. Stift A sei die Quelle, Stift B der Helfer und Stift C das Ziel.

Schritt 1) Anfangs sind alle Scheiben auf Stift A gestapelt.

Lรถse das Turm-von-Hanoi-Rรคtsel

In dieser Phase: 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 immer nur eine Scheibe gleichzeitig bewegen kรถnnen, reduziert dieser Schritt unser 3-Scheiben-Problem auf ein 2-Scheiben-Problem, das durch einen rekursiven Aufruf gelรถst wird.

Schritt 2) Wenn wir von Peg A aus einen rekursiven Aufruf mit Peg B als Ziel durchfรผhren, verwenden wir Peg C als Hilfsknoten.

Beachten Sie, dass wir uns wieder in Phase eins des Turm-von-Hanoi-Problems befinden, diesmal jedoch mit zwei Scheiben. Wir bewegen n-1 (also eine) Scheibe vom Startpunkt zum Hilfspunkt, wodurch die kleinste Scheibe von Stab A zu Stab C bewegt wird.

Lรถse das Turm-von-Hanoi-Rรคtsel

In dieser Phase: Quelle = Stift A, Ziel = Stift B, Helfer = Stift C.

Schritt 3) GemรครŸ dem Algorithmus wird nun die n-te (2.) Scheibe an den Zielpunkt, Steckplatz B, รผbertragen.

Lรถse das Turm-von-Hanoi-Rรคtsel

In dieser Phase: Quelle = Stift A, Ziel = Stift B, Helfer = Stift C.

Schritt 4) Nun bewegen wir die n-1-te Scheibe (Scheibe eins) vom Hilfsstift C zum Zielstift B, gemรครŸ dem dritten Schritt des Algorithmus.

Lรถse das Turm-von-Hanoi-Rรคtsel

In dieser Phase: Quelle = Stift A, Ziel = Stift B, Helfer = Stift C.

Schritt 5) Nach Abschluss des rekursiven Aufrufs kehren wir zu unserer vorherigen Einstellung in der ersten Phase des Algorithmus zurรผck.

Schritt 6) Im zweiten Schritt bewegen wir die Scheibe 3 vom Quellanschluss A zum Zielanschluss C.

In dieser Phase: Quelle = Stift A, Ziel = Stift C, Helfer = Stift B.

Schritt 7) Die nรคchste Aufgabe besteht darin, die verbleibenden Scheiben vom Hilfsteller (Stift B) zum Zielteller (Stift C) zu bewegen. Diesmal verwenden wir den ursprรผnglichen Quellteller (Stift A) als Hilfsteller.

Lรถse das Turm-von-Hanoi-Rรคtsel

Schritt 8) Da wir nicht zwei Datentrรคger gleichzeitig bewegen kรถnnen, fรผhren wir einen rekursiven Aufruf fรผr Datentrรคger 1 durch. Laut unserer AlgorithmusDas Ziel in diesem Schritt ist Pfosten A.

Lรถse das Turm-von-Hanoi-Rรคtsel

In dieser Phase: Quelle = Stift B, Ziel = Stift A, Helfer = Stift C.

Schritt 9) Unser rekursiver Aufruf ist abgeschlossen. Wir verschieben nun Datentrรคger 2 von seinem Quell- zum Zieldatentrรคger.

Lรถse das Turm-von-Hanoi-Rรคtsel

In dieser Phase: Quelle = Stift B, Ziel = Stift C, Helfer = Stift A.

Schritt 10) Zum Schluss verschieben wir die verbleibende n-1-Disk (Disk 1) vom Hilfs- zum Zielsystem.

Lรถse das Turm-von-Hanoi-Rรคtsel

In dieser Phase: Quelle = Stift A, Ziel = Stift C, Helfer = Stift B.

Spitzname Code 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 die zeitliche und rรคumliche Komplexitรคt des Turms von Hanoi:

1) Zeitliche Komplexitรคt:

Betrachtet man den Algorithmus, so wird er bei jedem Aufruf zweimal rekursiv fรผr (n-1) Scheiben aufgerufen. Jede (n-1)-te Rekursion zerfรคllt in ((n-1)-1)-te Rekursionen usw., bis man den Basisfall mit einer einzigen Scheibe erreicht.

Fรผr drei Disketten:

  • Disk 3 ruft die rekursive Funktion fรผr Disk 2 zweimal auf.
  • Disk 2 ruft die rekursive Funktion fรผr Disk 1 zweimal auf.
  • Scheibe 1 bewegt sich in konstanter Zeit, wodurch genรผgend Zeit bleibt, um die Gleichung fรผr drei Scheiben zu lรถsen.

Als wiederkehrendes Ereignis ausgedrรผckt:

= 2 ร— (Zeit zum Berechnen der beiden Scheiben) + konstante Zeit zum Bewegen der Scheibe 3

= 2 ร— (2 ร— Zeit zum Berechnen einer Scheibe + konstante Zeit zum Bewegen der zweiten Scheibe) + konstante Zeit zum Bewegen der dritten Scheibe

= (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 ergibt sich Folgendes:

2n-1 ร— konstante Zeit zum Bewegen der Scheibe 1 + 2n-2 ร— konstante Zeit zum Bewegen der Scheibe 2 + โ€ฆ.

Diese geometrische Folge summiert sich zu O(2n โ€“ 1), was sich vereinfacht zu O (2n), eine exponentielle Zeitkomplexitรคt.

2) Speicherkomplexitรคt:

Die Speicherkomplexitรคt des Turms von Hanoi betrรคgt O(n). Die Rekursion nutzt den Aufrufstapel, dessen maximale Tiefe n, der Anzahl der Scheiben, entspricht. Daher ist die Speicherkomplexitรคt O(n).

Hรคufig gestellte Fragen

Der Turm-von-Hanoi-Algorithmus ist ein rekursives Verfahren, das n Scheiben von einem Startpunkt zu einem Zielpunkt bewegt, indem es einen Hilfspunkt verwendet, wobei niemals eine grรถรŸere Scheibe auf eine kleinere gelegt wird.

Die minimale Anzahl an Zรผgen fรผr n Scheiben betrรคgt 2^n โ€“ 1. Drei Scheiben benรถtigen 7 Zรผge, vier Scheiben benรถtigen 15 Zรผge und zehn Scheiben benรถtigen 1,023 Zรผge.

Die Zeitkomplexitรคt betrรคgt O(2^n), da jede zusรคtzliche Scheibe den Arbeitsaufwand verdoppelt. Die Rekursionsgleichung T(n) = 2T(n-1) + 1 ergibt 2^n โ€“ 1, was exponentiell ist.

Die Speicherkomplexitรคt betrรคgt O(n), da der Rekursionsaufrufstapel fรผr jede verarbeitete Festplatte einen Frame speichert. Die maximale Rekursionstiefe betrรคgt n, daher ist der benรถtigte Zusatzspeicher linear in der Anzahl der Festplatten.

Ja. Eine iterative Lรถsung verwendet eine Schleife mit einem festen Muster: Bei ungeraden Zรผgen wird die kleinste Scheibe zyklisch zwischen den Stรคben getauscht, und bei geraden Zรผgen wird der einzig zulรคssige Zug, der nicht die kleinste Scheibe ist, ausgefรผhrt.

Der Algorithmus lehrt Rekursion, modelliert Backup-Rotationsschemata fรผr die Speicherung, steuert die Sequenzierung von Roboterarmen und taucht in neuropsychologischen Tests auf, die die Planungsfรคhigkeit messen.

Agenten fรผr bestรคrkendes Lernen lรถsen den Turm von Hanoi, indem sie jede Scheibenkonfiguration als Zustand und jeden Zug als Aktion behandeln. Er dient als gรคngiger Benchmark fรผr Planung und hierarchisches Strategielernen.

Ja. GitHub Copilot, ChatGPT und Gemini Rekursive Lรถsungen fรผr den Turm von Hanoi generieren in Python, C++ und JavaDie Entwickler sollten dennoch die Basisfรคlle und die Argumentreihenfolge รผberprรผfen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: