Tower of Hanoi Algoritm: Python, C++ Code
โก Smart sammanfattning
Hanoi-tornets algoritm รคr ett klassiskt rekursivt pussel som flyttar en stapel skivor mellan tre pinnar utan att placera en stรถrre skiva ovanpรฅ en mindre, vilket tydligt illustrerar dela-och-hรคrska-metoden.

Vad รคr Tower of Hanoi?
Hanois torn รคr ett matematiskt pussel som bestรฅr av tre stavar och en stapel skivor av minskande storlek placerade ovanpรฅ varandra. Det รคr ocksรฅ kรคnt som Brahmas torn eller Lucas-tornet, eftersom den franske matematikern Edouard Lucas introducerade det 1883. Pusslet รคr baserat pรฅ legender om att flytta guldskivor mellan tre stavar.
Detta pussel har tre stavar och ett variabelt antal staplade skivor. Stavarna รคr arrangerade som cykliska torn, sรฅ de stรถrre skivorna รคr staplade lรคngst ner och de mindre skivorna รคr staplade ovanpรฅ.
Inledningsvis fรฅr vi tre pinnar eller stavar. En av dem (pinne A i exemplet) har alla skivor staplade. Mรฅlet รคr att flytta hela stapeln frรฅn en stav (A) till en annan (C) samtidigt som man fรถljer nรฅgra specifika regler.
Hรคr รคr den ursprungliga uppstรคllningen av pusslet:
Tornet i Hanoi problem
Och detta รคr det slutgiltiga mรฅlet:
Regler fรถr Tower of Hanoi
Hรคr รคr de viktigaste reglerna fรถr Hanois torn:
- I pusslets initiala tillstรฅnd รคr alla skivor staplade pรฅ stรฅng ett.
- I sluttillstรฅndet staplas alla skivor frรฅn stรฅng ett pรฅ stรฅng tvรฅ eller stรฅng tre.
- Endast en skiva kan rรถra sig frรฅn en stรฅng till en annan รฅt gรฅngen.
- Endast den รถversta skivan pรฅ en stรฅng kan flyttas.
- En disk kan inte placeras ovanpรฅ en mindre disk.
Den ursprungliga legenden handlade om att flytta 64 skivor. Prรคsterna kunde flytta en skiva i taget enligt reglerna. Enligt legenden fanns det en profetia om att vรคrlden skulle gรฅ under om de kunde slutfรถra handlingen. I avsnittet om tidskomplexitet kommer vi att visa att en Hanoi-tornuppsรคttning med n skivor krรคver 2^n โ 1 drag.
Sรฅ, om prรคsterna behรถvde 1 sekund fรถr att flytta en disk, skulle den totala tiden fรถr att lรถsa pusslet vara 2^64 โ 1 sekund, eller ungefรคr 584 942 417 356 รฅr, 26 dagar, 7 timmar och 15 sekunder.
Algoritm fรถr Tower of Hanoi
Det vanligaste sรคttet att lรถsa Hanoi-tornet รคr en rekursiv algoritm. Fรถrst vรคljer vi tvรฅ stavar som kรคlla och destination; reservpinnen fungerar som hjรคlppinne eller hjรคlptรฅng.
Hรคr รคr stegen fรถr att lรถsa Tower of Hanoi-pusslet:
- Flytta de รถversta n-1-skivorna frรฅn kรคllpinnen till hjรคlppinnen.
- Flytta den n:te disken frรฅn kรคllpinnen till destinationspinnen.
- Flytta de รฅterstรฅende n-1 diskarna frรฅn hjรคlppinnen till destinationspinnen.
Obs: Om vi โโhar en enda disk kan vi flytta den direkt frรฅn kรคllan till destinationen.
Hur man lรถser Tower of Hanoi Puzzle
Lรฅt oss illustrera algoritmen fรถr tre skivor. Betrakta peg A som kรคlla, peg B som hjรคlp och peg C som destination.
Steg 1) Ursprungligen staplas alla skivor pรฅ pinne A.
I detta skede: Kรคlla = Peg A, Destination = Peg C, Hjรคlpare = Peg B.
Nu mรฅste vi flytta de รถversta n-1-skivorna frรฅn kรคllan till hjรคlparen.
Obs: รven om vi bara kan flytta en disk รฅt gรฅngen, reducerar detta steg vรฅrt 3-diskproblem till ett 2-diskproblem, vilket hanteras av ett rekursivt anrop.
Steg 2) Nรคr vi gรถr ett rekursivt anrop frรฅn peg A med peg B som destination, anvรคnder vi peg C som hjรคlpare.
Observera att vi รคr tillbaka pรฅ steg ett fรถr samma problem med Hanoi-tornet, men nu fรถr tvรฅ skivor. Vi flyttar n-1 (det vill sรคga en) skiva frรฅn kรคllan till hjรคlpskivan, vilket flyttar den minsta skivan frรฅn pinne A till pinne C.
I detta skede: Kรคlla = peg A, Destination = peg B, Hjรคlpare = peg C.
Steg 3) Enligt algoritmen รถverfรถrs nu den n:te (2:a) disken till destinationen, peg B.
I detta skede: Kรคlla = peg A, Destination = peg B, Hjรคlpare = peg C.
Steg 4) Nu flyttar vi n-1-disken (disk ett) frรฅn hjรคlppinne C till destinationspinne B, enligt algoritmens tredje steg.
I detta skede: Kรคlla = peg A, Destination = peg B, Hjรคlpare = peg C.
Steg 5) Efter att ha slutfรถrt det rekursiva anropet รฅtergรฅr vi till vรฅr tidigare instรคllning i algoritmens fรถrsta steg.
Steg 6) I det andra steget flyttar vi disk 3 frรฅn kรคllpinne A till destinationspinne C.
I detta skede: Kรคlla = peg A, Destination = peg C, Hjรคlpare = peg B.
Steg 7) Nรคsta uppgift รคr att flytta de รฅterstรฅende diskarna frรฅn hjรคlpen (peg B) till destinationen (peg C). Vi kommer att anvรคnda den ursprungliga kรคllan (peg A) som hjรคlp den hรคr gรฅngen.
Steg 8) Eftersom vi inte kan flytta tvรฅ diskar samtidigt gรถr vi ett rekursivt anrop fรถr disk 1. Enligt vรฅr algoritm, destinationen i detta steg รคr peg A.
I detta skede: Kรคlla = peg B, Destination = peg A, Hjรคlpare = peg C.
Steg 9) Vรฅrt rekursiva anrop รคr slutfรถrt. Vi flyttar nu disk 2 frรฅn dess kรคlla till dess destination.
I detta skede: Kรคlla = peg B, Destination = peg C, Hjรคlpare = peg A.
Steg 10) Vi avslutar med att flytta den รฅterstรฅende n-1 disken (disk 1) frรฅn hjรคlparen till destinationen.
I detta skede: Kรคlla = peg A, Destination = peg C, Hjรคlpare = peg B.
Pseudo Code fรถr Hanois torn
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
Programkod 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; }
Produktion:
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
Programkod 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')
Produktion:
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
Komplexiteten av Tower of Hanoi
Hรคr รคr tids- och rumskomplexiteten i Hanois torn:
1) Tidskomplexitet:
Om vi โโtittar tillbaka pรฅ algoritmen gรถr vi ett rekursivt anrop fรถr (n-1) diskar tvรฅ gรฅnger per anrop. Varje (n-1) rekursion delas upp i ((n-1)-1) rekursioner, och sรฅ vidare, tills vi nรฅr basfallet med en enda disk.
Fรถr tre skivor:
- Disk 3 anropar den rekursiva funktionen fรถr disk 2 tvรฅ gรฅnger.
- Disk 2 anropar den rekursiva funktionen fรถr disk 1 tvรฅ gรฅnger.
- Skiva 1 rรถr sig i konstant tid, vilket ger tid att lรถsa fรถr tre diskar.
Uttryckt som en รฅterkommande hรคndelse:
= 2 ร (Tid att lรถsa fรถr tvรฅ skivor) + konstant tid att flytta skiva 3
= 2 ร (2 ร tid att lรถsa fรถr en disk + konstant tid att flytta disk 2) + konstant tid att flytta disk 3
= (2 ร 2) ร konstant tid fรถr att flytta disk 1 + 2 ร konstant tid fรถr att flytta disk 2 + konstant tid fรถr att flytta disk 3
Fรถr n diskar blir detta:
2N 1 ร konstant tid att flytta skiva 1 + 2N 2 ร konstant tid fรถr att flytta disk 2 + โฆ.
Denna geometriska progression summerar till O(2n โ 1), vilket fรถrenklar O (2n), en exponentiell tidskomplexitet.
2) Rymdkomplexitet:
Rymdkomplexiteten fรถr Hanoi-tornet รคr O(n). Rekursionen anvรคnder anropsstacken, och stackens maximala djup รคr lika med n, antalet diskar. Det รคr dรคrfรถr rymdkomplexiteten รคr O(n).










