Algoritmul Turnului Hanoi: Python, C++ Cod
Ce este Turnul din Hanoi?
Turnul din Hanoi este un puzzle matematic format din trei tije ศi numeroase discuri aศezate una peste alta. Este cunoscut ศi sub numele de Turnul lui Brahma sau turnul Lucas, aศa cum l-a introdus matematicianul francez Edouard Lucas รฎn 1883. Acest puzzle se bazeazฤ pe legende despre miศcarea discurilor de aur รฎntre trei tije.
Acest puzzle are trei tije ศi un numฤr variabil de discuri stivuite. Aceste tije sunt proiectate ca turnuri ciclice. Deci, discurile mai mari รฎn diametru sunt stivuite รฎn partea de jos, iar discurile mai mici sunt stivuite deasupra.
Iniศial, ni se dau trei cuie sau tije. ศi unul dintre ele (A, prezentat รฎn exemplu) are toate discurile stivuite. Ne propunem sฤ mutฤm un รฎntreg teanc de discuri de la o tijฤ (A) la alta (C) respectรขnd niศte reguli specifice.
Iatฤ configuraศia iniศialฤ a puzzle-ului -

ศi acesta este scopul final -
Regulile Turnului din Hanoi
Iatฤ cรขteva reguli esenศiale pentru Turnul din Hanoi:
- Starea iniศialฤ a acestui puzzle, toate discurile vor fi stivuite รฎntr-o tijฤ.
- Starea finalฤ este cฤ toate acele discuri de la tija unu vor fi stivuite pe tija douฤ sau tija trei.
- Putem muta un disc de pe o tijฤ la alta รฎn orice moment.
- Putem muta doar discul de sus de pe tijฤ.
- Un disc nu poate fi plasat peste un alt disc, care este mai mic.
Legenda originalฤ era despre mutarea a 64 de discuri. Preoศii puteau muta cรขte un disc, conform regulilor. Potrivit legendei, a existat o profeศie conform cฤreia lumea se va sfรขrศi dacฤ ar putea duce la bun sfรขrศit actul. รn secศiunea de complexitate a timpului, vom arฤta cฤ o setare a Turnului din Hanoi de n discuri ar costa 2^n โ 1 miศcare.
Deci, dacฤ preoศii ar putea avea nevoie de 1 secundฤ pentru a muta discurile, timpul total de care ar avea nevoie pentru a rezolva puzzle-ul ar fi de 2^64 โ 1 secundฤ sau 584,942,417,356 de ani, 26 de zile, 7 ore ศi 15 secunde.
Algoritm pentru Turnul din Hanoi
O modalitate generalฤ de a rezolva Turnul din Hanoi este un algoritm recursiv. รn primul rรขnd, trebuie sฤ decidem asupra a douฤ tije sau cuie ca sursฤ ศi destinaศie, iar cuiul de rezervฤ ar fi un auxiliar sau un ajutor.
Iatฤ paศii pentru a rezolva puzzle-ul Turnul din Hanoi:
- Mutaศi discurile superioare n-1 de la suportul sursฤ la suportul de ajutor.
- Dupฤ aceea, mutaศi al n-lea disc de la peg-ul sursฤ la cel de destinaศie.
- รn cele din urmฤ, mutaศi restul n-1 discuri de pe piciorul de ajutor pe piciorul de destinaศie.
notiศe: Dacฤ avem un singur disc, รฎl putem muta direct de la sursฤ la destinaศie.
Cum sฤ rezolvi puzzle-ul Turnul din Hanoi
Sฤ ilustrฤm algoritmul pentru trei discuri ศi sฤ considerฤm peg A ca sursฤ, peg B ca ajutor ศi peg C ca destinaศie
Pas 1) Iniศial, toate discurile vor fi stivuite pe suportul A.
รn aceastฤ etapฤ:
Sursa = Peg A
Destinaศie = Peg C
Ajutor = Peg B
Acum, trebuie sฤ mutฤm discurile de sus n-1 de la sursฤ la helper.
Notฤ: Deศi putem muta doar un disc la un moment dat, problema noastrฤ trece de la o problemฤ de 3 discuri la o problemฤ de 2 discuri, care este un apel recursiv.
Pas 2) Pe mฤsurฤ ce numim un apel recursiv de la peg A ศi destinaศia este peg B, vom folosi peg C ca ajutor.
Observaศi cฤ suntem din nou la prima etapฤ pentru aceeaศi problemฤ a turnului din Hanoi pentru douฤ discuri.
Acum trebuie sฤ mutฤm n-1 sau un disc de la sursฤ la helper, mutรขnd cel mai mic disc de la peg A la peg C.
รn aceastฤ etapฤ:
Sursa = peg A
Destinaศie = peg B
Ajutor = pion C
Pas 3) Apoi, conform algoritmului nostru, al n-lea sau al doilea disc trebuie transferat รฎn destinaศia sau peg-ul B.
รn aceastฤ etapฤ:
Sursa = peg A
Destinaศie = peg B
Ajutor = pion C
Pas 4) Acum, vom muta discurile n-1 sau discul unul de la helper sau peg C la destinaศie sau peg B conform celei de-a treia etape a algoritmului nostru.
รn aceastฤ etapฤ:
Sursa = peg A
Destinaศie = peg B
Ajutor = pion C
Pas 5) Dupฤ finalizarea apelului recursiv, vom reveni la setarea anterioarฤ la prima etapฤ a algoritmului.
Pas 6) Acum, รฎn a doua etapฤ, ne vom muta sursa la destinaศia noastrฤ, care este mutarea discului 3 la pionul C de la pilonul A.
รn aceastฤ etapฤ:
Sursa = peg A
Destinaศie = peg C
Ajutor = chela B
Pas 7) Acum putem vedea asta
d este de a muta discurile rฤmase de la helper (peg B) la destinaศie (peg C). Vom folosi sursa iniศialฤ sau peg A ca ajutor รฎn acest caz.
Pas 8) Deoarece nu putem muta douฤ discuri simultan, vom apela un apel recursiv pentru discul 1. Conform ultimului pas ศi a noastrฤ Algoritmul, o destinaศie รฎn acest pas este chela A.
รn aceastฤ etapฤ:
Sursa = peg B
Destinaศie = peg A
Ajutor = pion C
Pas 9) Apelul nostru recursiv este finalizat acum. Apoi mutฤm discul 2 de la sursฤ la destinaศie.
รn aceastฤ etapฤ:
Sursa = peg B
Destinaศie = peg C
Ajutor = chel A
Pas 10) Apoi mutฤm n-1 sau discul 1 rฤmas de la helper la destinaศie.
รn aceastฤ etapฤ:
Sursa = peg A
Destinaศie = peg C
Ajutor = chela B
Pseudocod pentru Turnul din 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
Codul programului รฎn 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;
}
producศie
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
Codul programului รฎn 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')
ieศire:
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
Complexitatea Turnului din Hanoi
Iatฤ complexitatea รฎn timp ศi spaศiu a Turnului din Hanoi:
1) Complexitatea timpului:
Dacฤ ne uitฤm รฎnapoi la algoritmul nostru, putem vedea cฤ introducem un apel recursiv pentru (n-1) discuri de douฤ ori. Acele apeluri recursive pentru (n-1) discuri pot fi รฎmpฤrศite รฎn alte ((n-1)-1) ศi aศa mai departe pรขnฤ cรขnd obศinem un singur disc de mutat.
Pentru trei discuri-
- Discul 3 apeleazฤ de douฤ ori o funcศie recursivฤ pentru discul doi.
- Discul 2 apeleazฤ de douฤ ori o funcศie recursivฤ pentru disc.
- Discul 1 se poate miศca รฎntr-un timp constant ศi timp de rezolvat pentru trei discuri.
= 2*(Timp de rezolvare pentru douฤ discuri) + constant Timp de mutare a discului 3
= 2*(2*timp de rezolvare pentru un disc + constantฤ de timp pentru a muta discul 2) + constantฤ de timp pentru a muta discul 3
= (2*2) (timp constant pentru mutarea discului 1) + 2*timp constant pentru mutarea discului 2 + timp constant pentru mutarea discului 3
Pentru n discuri, poate fi scris ca โ
(2n-1 * timp constant pentru a muta discul 1 + 2n-2 * timp constant pentru a muta discul 2 + ....
Aceastฤ progresie geometricฤ va avea ca rezultat O(2n-1) Sau O(2n), care este exponenลฃial.
2) Complexitatea spaศiului
Complexitatea spaศialฤ a Turnului din Hanoi este 0(n). Asta pentru cฤ trebuie sฤ stocฤm secvenศa plฤcilor. Cรขnd folosim recursiunea, aceasta foloseศte stiva. ศi dimensiunea maximฤ a stivei poate fi โnโ. De aceea complexitatea spaศiului devine O(n).









