Tower of Hanoi Algoritme: Python, C++ Kode

Hva er Tower of Hanoi?

Tower of Hanoi er et matematisk puslespill som bestรฅr av tre stenger og tallrike disker plassert over hverandre. Det er ogsรฅ kjent som Tower of Brahma eller Lucas-tรฅrnet, slik den franske matematikeren Edouard Lucas introduserte det tilbake i 1883. Dette puslespillet er basert pรฅ legender om รฅ flytte gullskiver mellom tre stenger.

Dette puslespillet har tre stenger og et variabelt antall stablede disker. Disse stengene er designet som sykliske tรฅrn. Sรฅ de stรธrre skivene i diameter er stablet pรฅ bunnen, og de mindre skivene er stablet pรฅ toppen.

Til รฅ begynne med fรฅr vi tre knagger eller stenger. Og en av dem (A, vist i eksempelet) har alle diskene stablet. Vi tar sikte pรฅ รฅ flytte en hel stabel med disker fra en stang (A) til en annen (C) ved รฅ fรธlge noen spesifikke regler.

Her er det fรธrste oppsettet av puslespillet-

Problemet med Tower of Hanoi
Problemet med Tower of Hanoi

Og dette er det endelige mรฅlet-

Tower of Hanoi

Reglene for Tower of Hanoi

Her er noen viktige regler for Tower of Hanoi:

  • Den opprinnelige tilstanden til dette puslespillet, alle diskene vil bli stablet i stang รฉn.
  • Den endelige tilstanden er at alle diskene fra stang en vil bli stablet pรฅ stang to eller stang tre.
  • Vi kan flytte en on-disk fra en stang til en annen til enhver tid.
  • Vi kan bare flytte den รธverste skiven fra stangen.
  • En disk kan ikke plasseres over en annen disk, som er mindre.

Den opprinnelige legenden handlet om รฅ flytte 64 disker. Prestene kunne flytte en disk om gangen i henhold til reglene. Ifรธlge legenden var det en profeti om at verden ville ende hvis de kunne fullfรธre handlingen. I tidskompleksitetsdelen vil vi vise at en Tower of Hanoi-innstilling pรฅ n disker vil koste 2^n โ€“ 1 trekk.

Sรฅ hvis prestene kunne kreve 1 sekund for รฅ flytte diskene, ville den totale tiden de ville trenge for รฅ lรธse gรฅten vรฆre 2^64 โ€“ 1 sekund eller 584,942,417,356 26 7 15 รฅr, XNUMX dager, XNUMX timer og XNUMX sekunder.

Algoritme for Tower of Hanoi

En generell mรฅte รฅ lรธse Tower of Hanoi pรฅ er en rekursiv algoritme. Fรธrst mรฅ vi bestemme oss for to stenger eller knagger som kilde og destinasjon, og reservepinnen vil vรฆre en hjelpe- eller hjelper.

Her er trinnene for รฅ lรธse Tower of Hanoi-puslespillet:

  • Flytt de รธverste n-1 diskene fra kildepinnen til hjelpepinnen.
  • Etterpรฅ flytter du den n'te disken fra kildepinnen til destinasjonspinnen.
  • Til slutt flytter du resten av n-1 diskene fra hjelpepinnen til destinasjonspinnen.

Merknader: Hvis vi har en enkelt disk, kan vi flytte den direkte fra kilde til destinasjon.

Hvordan lรธse Tower of Hanoi Puzzle

La oss illustrere algoritmen for tre disker og vurdere peg A som kilden, peg B som hjelperen og peg C som destinasjon

Trinn 1) Til รฅ begynne med vil alle diskene bli stablet pรฅ pinne A.

Lรธs Tower of Hanoi Puzzle

Pรฅ dette stadiet:

Kilde = Peg A
Destinasjon = Peg C
Hjelper = Peg B

Nรฅ mรฅ vi flytte de รธverste n-1-diskene fra kilden til hjelperen.

OBS: Selv om vi bare kan flytte รฉn disk om gangen, bryter det problemet vรฅrt fra et 3-disk-problem til et 2-disk-problem, som er et rekursivt kall.

Trinn 2) Ettersom vi kaller et rekursivt anrop fra peg A og mรฅlet er peg B, vil vi bruke peg C som en hjelper.

Legg merke til at vi er pรฅ trinn รฉn igjen for det samme tรฅrnet i Hanoi-problemet for to disker.

Nรฅ mรฅ vi flytte n-1 eller en disk fra kilde til hjelper, flytte den minste disken fra pinne A til pinne C.

Lรธs Tower of Hanoi Puzzle

Pรฅ dette stadiet:

Kilde = pinne A
Destinasjon = pinne B
Hjelper = pinne C

Trinn 3) Deretter, i henhold til vรฅr algoritme, skal det n-te eller andre diskbehovet overfรธres til destinasjonen eller peg B.

Lรธs Tower of Hanoi Puzzle

Pรฅ dette stadiet:

Kilde = pinne A
Destinasjon = pinne B
Hjelper = pinne C

Trinn 4) Nรฅ vil vi flytte n-1-diskene eller disken en fra hjelperen eller pinne C til destinasjonen eller pinne B i henhold til den tredje fasen av algoritmen vรฅr.

Lรธs Tower of Hanoi Puzzle

Pรฅ dette stadiet:

Kilde = pinne A
Destinasjon = pinne B
Hjelper = pinne C

Trinn 5) Etter รฅ ha fullfรธrt den rekursive samtalen, vil vi gรฅ tilbake til vรฅr forrige innstilling nรฅr den fรธrste fasen av algoritmen.

Trinn 6) Nรฅ, i det andre trinnet, vil vi flytte kilden vรฅr til destinasjonen vรฅr, som flytter disk 3 til pinne C fra pinne A.

Pรฅ dette stadiet:

Kilde = pinne A
Destinasjon = pinne C
Hjelper = knagg B

Trinn 7) Nรฅ kan vi se det

Lรธs Tower of Hanoi Puzzle

d er รฅ flytte de gjenvรฆrende diskene fra hjelperen (pinnen B) til destinasjonen (pinnen C). Vi vil bruke den opprinnelige kilden eller pinne A som en hjelper i dette tilfellet.

Trinn 8) Siden vi ikke kan flytte to disker samtidig, vil vi kalle et rekursivt kall for disk 1. I henhold til siste trinn og vรฅr algoritme, en destinasjon i dette trinnet er pinne A.

Lรธs Tower of Hanoi Puzzle

Pรฅ dette stadiet:

Kilde = pinne B
Destinasjon = pinne A
Hjelper = pinne C

Trinn 9) Vรฅr rekursive samtale er fullfรธrt nรฅ. Deretter flytter vi disk 2 fra kilden til destinasjonen.

Lรธs Tower of Hanoi Puzzle

Pรฅ dette stadiet:

Kilde = pinne B
Destinasjon = pinne C
Hjelper = pinne A

Trinn 10) Deretter flytter vi vรฅr gjenvรฆrende n-1 eller disk 1 fra hjelper til destinasjon.

Lรธs Tower of Hanoi Puzzle

Pรฅ dette stadiet:

Kilde = pinne A
Destinasjon = pinne C
Hjelper = knagg B

Pseudokode for Tower of 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

Programkode i 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;
}

Produksjon

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

Programkode i 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')

Utgang:

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

Kompleksiteten til Tower of Hanoi

Her er kompleksiteten i tid og rom til Tower of Hanoi:

1) Tidskompleksitet:

Hvis vi ser tilbake pรฅ algoritmen vรฅr, kan vi se at vi introduserer et rekursivt kall for (n-1) disker to ganger. Disse rekursive kallene for (n-1) disker kan brytes ned i andre ((n-1)-1) og sรฅ videre til vi bare fรฅr รฉn disk รฅ flytte.

For tre disker-

  • Disk 3 kaller en rekursiv funksjon for disk to to ganger.
  • Disk 2 kaller en rekursiv funksjon for disk รฉn to ganger.
  • Disk 1 kan bevege seg innenfor konstant tid, og tid til รฅ lรธse for tre disker.

= 2*(Tid for รฅ lรธse for to disker) + konstant Tid for รฅ flytte disk 3

= 2*(2*tid รฅ lรธse for รฉn disk + konstant Tid for รฅ flytte disk 2) + konstant Tid for รฅ flytte disk 3

= (2*2) (konstant tid for รฅ flytte disk 1) + 2*konstant tid for รฅ flytte disk 2 + konstant tid for รฅ flytte disk 3

For n disker kan det skrives som โ€“

(2n-1 * konstant tid for รฅ flytte disk 1 + 2n-2 * konstant tid for รฅ flytte disk 2 + โ€ฆ.

Denne geometriske progresjonen vil resultere i O(2n-1) Eller O(2n), som er eksponentiell.

2) Romkompleksitet

Romkompleksiteten til Tower of Hanoi er 0(n). Det er fordi vi mรฅ lagre rekkefรธlgen pรฅ platene. Nรฅr vi bruker rekursjonen, bruker den stabelen. Og den maksimale stรธrrelsen pรฅ stabelen kan vรฆre "n." Det er derfor romkompleksiteten blir O(n).

Oppsummer dette innlegget med: