Hanoi Tower algoritmusa: Python, C++ Code

⚡ Okos összefoglaló

A Hanoi torony algoritmusa egy klasszikus rekurzív kirakós játék, amely egy korongköteget mozgat három pöck között úgy, hogy soha nem helyez nagyobb korongot egy kisebbre, ami világosan illusztrálja az oszd meg és uralkodj elvet.

  • 🗼 Rejtvény előkészítése: Három csap és n korong csökkenő méretben egymásra rakva a forráscsapon, arra várva, hogy egy segédcsap segítségével a célcsapra mozgassák őket.
  • 📜 Szabályok: Egyszerre csak egy korong mozoghat, bármely csapnak csak a felső korongja mozdulhat el, és egy nagyobb korong nem helyezkedhet el egy kisebb korongon.
  • 🔁 Rekurzív ötlet: Helyezz n-1 korongot a segédpöcögre, helyezd a legnagyobb korongot a célpöcögre, majd helyezd át az n-1 korongot a segédpöcögről a célpöcögőre.
  • ⏱️ Idő összetettsége: Az n korong megoldása 2^n – 1 lépést igényel, ami exponenciális O(2^n) időbonyolultságot eredményez, ami nagyon gyorsan növekszik n növekedésével.
  • 🧠 Tér összetettsége: A rekurziós verem egyszerre legfeljebb n képkockát tárol, így a rekurzív megoldás térkomplexitása O(n).
  • 🇧🇷 Alkalmazások: Rekurzió, biztonsági mentési rotációs sémák, verem alapú adatmozgatás, robotikus szekvenálás és az oszd meg és uralkodj algoritmustervezés megértése.

Hanoi torony algoritmus

Mi a hanoi torony?

A Hanoi-torony egy matematikai rejtvény, amely három rúdból és egymásra helyezett, egyre kisebb méretű korongokból álló halomból áll. Brahma tornyaként vagy Lucas-toronyként is ismert, mivel a francia matematikus, Edouard Lucas 1883-ban mutatta be. A rejtvény az aranykorongok három rúd közötti mozgatásáról szóló legendákon alapul.

Ez a kirakós játék három rudat és változó számú egymásra helyezett korongot tartalmaz. A rudak ciklikus tornyokként vannak elrendezve, így a nagyobb korongok alul, a kisebbek pedig felül vannak egymásra halmozva.

Kezdetben adottak vagyunk három csapnak vagy rudnak. Az egyikre (a példában az A csapra) az összes korongot egymásra helyezzük. A cél az, hogy a teljes halmot az egyik rúdról (A) a másikra (C) helyezzük át, néhány konkrét szabály betartása mellett.

Íme a puzzle kezdeti felállása:

Hanoi Tower probléma

Hanoi Tower probléma

És ez a végső cél:

Hanoi-torony

A Hanoi Tower szabályai

Íme a Hanoi-torony alapvető szabályai:

  • A kirakós kezdeti állapotában az összes korong az egyes rúdra van halmozva.
  • Végső állapotban az egyes rúd összes korongja a kettes vagy a harmadik rúdra kerül.
  • Egyszerre csak egy korong tud átmozdulni az egyik rúdról a másikra.
  • Csak a rúd legfelső korongja mozgatható.
  • Egy lemezt nem lehet egy kisebb lemezre helyezni.

Az eredeti legenda 64 korong mozgatásáról szólt. A papok a szabályok szerint egyszerre csak egy korongot mozgathattak. A legenda szerint volt egy jóslat, miszerint a világ vége lesz, ha végrehajtják a műveletet. Az időbonyolultság részben bemutatjuk, hogy egy n korongból álló Hanoi-torony beállítás 2^n – 1 lépést igényel.

Tehát, ha a papoknak 1 másodpercre lenne szükségük egy korong mozgatásához, a rejtvény megoldásának teljes ideje 2^64 – 1 másodperc lenne, azaz nagyjából 584 942 417 356 év, 26 nap, 7 óra és 15 másodperc.

Algoritmus a Tower of Hanoi számára

A Hanoi-torony megoldásának leggyakoribb módja a rekurzív algoritmus. Először két rudat választunk forrásként és célként; a tartalék csap segéd- vagy segítőként működik.

Íme a lépések a Hanoi Tower rejtvény megoldásához:

  • Helyezze át a felső n-1 lemezeket a forráscsapról a segédcsapra.
  • Mozgasd az n-edik korongot a forráspontról a célpontra.
  • Helyezd át a maradék n-1 korongot a segédpöcögről a célpöcögőre.

Jegyzet: Ha egyetlen lemezünk van, akkor azt közvetlenül a forrásból a célhelyre mozgathatjuk.

Hogyan kell megoldani a Tower of Hanoi puzzle-t

Szemléltessük az algoritmust három korong esetén. Tekintsük az A csapot forrásként, a B csapot segítőként, a C csapot pedig célként.

Step 1) Kezdetben az összes korongot az A csapra helyezzük.

Oldd meg a Tower of Hanoi puzzle-t

Ebben a szakaszban: Forrás = A szeg, Cél = C szeg, Segítő = B szeg.

Most át kell helyeznünk a felső n-1 lemezt a forrásból a segédbe.

Jegyzet: Bár egyszerre csak egy lemezt mozgathatunk, ez a lépés a 3 lemezes problémánkat 2 lemezes problémára redukálja, amelyet egy rekurzív hívás kezel.

Step 2) Mivel rekurzív hívást indítunk az A pegről, a B peg a cél, a C peg-et használjuk segítőként.

Figyeljük meg, hogy visszaértünk az első szakaszhoz ugyanannál a Hanoi-torony problémánál, de most két koronggal. n-1 (azaz egy) korongot mozgatunk a forrásból a segítőbe, amely a legkisebb korongot mozgatja az A csapról a C csapra.

Oldd meg a Tower of Hanoi puzzle-t

Ebben a szakaszban: Forrás = A szeg, Cél = B szeg, Segítő = C szeg.

Step 3) Az algoritmus szerint az n-edik (2.) lemezt most áthelyezik a célállomásra, a B pontra.

Oldd meg a Tower of Hanoi puzzle-t

Ebben a szakaszban: Forrás = A szeg, Cél = B szeg, Segítő = C szeg.

Step 4) Most az n-1-es lemezt (az első lemezt) a C segédpegről a B célpegre mozgatjuk, az algoritmus harmadik lépését követve.

Oldd meg a Tower of Hanoi puzzle-t

Ebben a szakaszban: Forrás = A szeg, Cél = B szeg, Segítő = C szeg.

Step 5) A rekurzív hívás befejezése után visszatérünk az algoritmus első szakaszában korábban beállított értékhez.

Step 6) A második szakaszban a 3-as lemezt áthelyezzük az A forráspontról a C célpontra.

Ebben a szakaszban: Forrás = A szeg, Cél = C szeg, Segítő = B szeg.

Step 7) A következő feladat a maradék lemezek áthelyezése a segédprogramból (B peg) a célprogramba (C peg). Ezúttal az eredeti forrásprogramot (A peg) fogjuk segédprogramként használni.

Oldd meg a Tower of Hanoi puzzle-t

Step 8) Mivel egyszerre nem mozgathatunk két lemezt, rekurzív hívást végzünk az 1. lemezre. A mi álláspontunk szerint algoritmus, a cél ebben a lépésben az A csap.

Oldd meg a Tower of Hanoi puzzle-t

Ebben a szakaszban: Forrás = B szeg, Cél = A szeg, Segítő = C szeg.

Step 9) A rekurzív hívásunk befejeződött. Most áthelyezzük a 2. lemezt a forrásból a célhelyre.

Oldd meg a Tower of Hanoi puzzle-t

Ebben a szakaszban: Forrás = B szeg, Cél = C szeg, Segítő = A szeg.

Step 10) A maradék n-1 lemez (1. lemez) segítőből célállomásra mozgatásával fejezzük be.

Oldd meg a Tower of Hanoi puzzle-t

Ebben a szakaszban: Forrás = A szeg, Cél = C szeg, Segítő = B szeg.

Pszeudo Code a Hanoi-toronyhoz

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

Programkód be 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;
}

output:

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

Programkód be 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')

output:

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

A Hanoi-torony összetettsége

Íme a Hanoi-torony időbeli és térbeli komplexitása:

1) Időbeli összetettség:

Visszatekintve az algoritmusra, hívásonként kétszer hívunk meg rekurzívan (n-1) lemezt. Minden (n-1) rekurzió ((n-1)-1) rekurzióra bontódik fel, és így tovább, amíg el nem érjük az egylemezes alapesetet.

Három lemez esetén:

  • A 3. lemez kétszer hívja meg az 2. lemez rekurzív függvényét.
  • A 2. lemez kétszer hívja meg az 1. lemez rekurzív függvényét.
  • Az 1. lemez konstans időben mozog, így van idő három korong megoldására.

Ismétlődésként kifejezve:

= 2 × (két korong megoldási ideje) + a 3. korong mozgatásának konstans ideje

= 2 × (2 × egy lemez megoldási ideje + a 2. lemez mozgatásának konstans ideje) + a 3. lemez mozgatásának konstans ideje

= (2 × 2) × az 1. lemez mozgatásához szükséges állandó idő + 2 × a 2. lemez mozgatásához szükséges állandó idő + a 3. lemez mozgatásához szükséges állandó idő

n lemez esetén ez így alakul:

2n 1 XNUMX × állandó idő az 1. + 2. lemez mozgatásáhozn 2 XNUMX × a 2. lemez mozgatásához szükséges állandó idő + ….

Ez a geometriai sorozat összege O(2n – 1), ami a következőre egyszerűsödik: O(2n), exponenciális időbonyolultság.

2) Térbeli komplexitás:

A Hanoi-torony térbonyolultsága O(n). A rekurzió a hívási vermet használja, és a verem maximális mélysége n, a korongok száma. Ezért a térbonyolultság O(n).

GYIK

A Hanoi-torony algoritmus egy rekurzív eljárás, amely n lemezt mozgat egy forráspontról egy célpontra egyetlen segédpont segítségével, miközben soha nem helyez nagyobb lemezt egy kisebb tetejére.

n korong minimális lépésszáma 2^n – 1. Három koronghoz 7, négy koronghoz 15, tíz koronghoz pedig 1,023 lépés szükséges.

Az időbonyolultság O(2^n), mivel minden további korong megduplázza a munkát. A T(n) = 2T(n-1) + 1 rekurzió 2^n – 1-re oldódik fel, ami exponenciális.

A tárhelybonyolultság O(n), mivel a rekurziós hívásverem minden feldolgozott lemezhez egy keretet tárol. A maximális rekurziós mélység eléri az n-et, így a szükséges segédmemória lineárisan arányos a lemezek számával.

Igen. Az iteratív megoldás egy rögzített mintázatú ciklust használ: páratlan lépéseknél ciklikusan cseréli a legkisebb korongot a csapok között, páros lépéseknél pedig az egyetlen legális, nem legkisebb lépést teszi meg.

Az algoritmus rekurziót tanít, modellezi a tartalék rotációs sémákat a tároláshoz, irányítja a robotkarok szekvenálását, és megjelenik a tervezési képességet mérő neuropszichológiai tesztekben.

A megerősítéses tanulási ágensek úgy oldják meg a Hanoi-torony problémáját, hogy minden korongkonfigurációt állapotként, minden mozdulatot pedig műveletként kezelnek. Ez egy általános viszonyítási alap a tervezéshez és a hierarchikus szabályzattanuláshoz.

Igen. GitHub Copilot, ChatGPT és Gemini rekurzív Hanoi-torony megoldások generálása Python, C++és JavaA fejlesztőknek továbbra is ellenőrizniük kell az alapeseteket és az argumentumok sorrendjét.

Foglald össze ezt a bejegyzést a következőképpen: