Algoritam kule Hanoi: Python, C++ Code

โšก Pametni saลพetak

Algoritam Hanojske kule je klasiฤna rekurzivna zagonetka koja pomiฤe hrpu diskova izmeฤ‘u tri klina, a da pritom nikada ne stavlja veฤ‡i disk na manji, ลกto jasno ilustrira princip "zavadi pa vladaj".

  • ๐Ÿ—ผ Postavljanje slagalice: Tri klina i n diskova naslaganih u smanjenoj veliฤini na izvornom klinu, ฤekaju da budu premjeลกteni na odrediลกni klin pomoฤ‡u pomoฤ‡nog klina.
  • ๐Ÿ“œ Pravila: Samo se jedan disk pomiฤe u isto vrijeme, moลพe se pomicati samo gornji disk bilo kojeg klina, a veฤ‡i disk ne moลพe leลพati na manjem disku.
  • ๐Ÿ” Rekurzivna ideja: Premjestite n-1 diskova na pomoฤ‡ni klin, premjestite najveฤ‡i disk na odrediลกni klin, a zatim premjestite n-1 diskova s โ€‹โ€‹pomoฤ‡nog klina na odrediลกte.
  • ๐Ÿ‡ง๐Ÿ‡ท Sloลพenost vremena: Rjeลกavanje n diskova zahtijeva 2^n โ€“ 1 poteza, ลกto daje eksponencijalnu vremensku sloลพenost od O(2^n) koja vrlo brzo raste s poveฤ‡anjem n.
  • ๐Ÿง  Sloลพenost prostora: Rekurzijski stog moลพe istovremeno pohraniti do n okvira, tako da je prostorna sloลพenost rekurzivnog rjeลกenja O(n).
  • ๐Ÿ› ๏ธ Primjena: Pouฤavanje rekurzije, shema rotacije sigurnosnih kopija, premjeลกtanja podataka temeljenog na stogu, robotskog sekvenciranja i razumijevanja dizajna algoritma "zavadi pa vladaj".

Algoritam Hanojskog tornja

ล to je toranj u Hanoju?

Hanojski toranj je matematiฤka zagonetka koja se sastoji od tri ลกtapa i snopa diskova sve manje veliฤine postavljenih jedan na drugi. Poznat je i kao Brahmin toranj ili Lucasov toranj, buduฤ‡i da ga je francuski matematiฤar Edouard Lucas predstavio 1883. godine. Zagonetka se temelji na legendama o pomicanju zlatnih diskova izmeฤ‘u tri ลกtapa.

Ova zagonetka ima tri ลกtapa i promjenjiv broj naslaganih diskova. ล tapovi su rasporeฤ‘eni kao cikliฤki tornjevi, tako da su veฤ‡i diskovi naslagani na dnu, a manji diskovi na vrhu.

U poฤetku imamo tri klina ili ลกipke. Na jednoj od njih (klina A u primjeru) sloลพeni su svi diskovi. Cilj je premjestiti cijeli snop s jedne ลกipke (A) na drugu (C) poลกtujuฤ‡i nekoliko specifiฤnih pravila.

Evo poฤetne postavke slagalice:

Problem kule u Hanoju

Problem kule u Hanoju

I ovo je konaฤni cilj:

Tower of Hanoi

Pravila tornja u Hanoju

Evo osnovnih pravila za Hanojski toranj:

  • U poฤetnom stanju slagalice, svi diskovi su sloลพeni na ลกtap jedan.
  • U konaฤnom stanju, svi diskovi s prve ลกipke sloลพeni su na drugu ili treฤ‡u ลกipku.
  • Samo jedan disk se moลพe pomicati s jedne ลกipke na drugu u bilo kojem trenutku.
  • Samo se gornji disk na ลกipki moลพe pomicati.
  • Disk se ne moลพe postaviti na manji disk.

Izvorna legenda govorila je o pomicanju 64 diska. Sveฤ‡enici su mogli pomicati jedan disk odjednom prema pravilima. Prema legendi, postojalo je proroฤanstvo da ฤ‡e svijet propasti ako uspiju dovrลกiti ฤin. U odjeljku o vremenskoj sloลพenosti pokazat ฤ‡emo da postavka Hanojske kule od n diskova zahtijeva 2^n โ€“ 1 poteza.

Dakle, ako bi sveฤ‡enicima trebala 1 sekunda za pomicanje jednog diska, ukupno vrijeme za rjeลกavanje zagonetke bilo bi 2^64 โ€“ 1 sekunda, ili otprilike 584,942,417,356 godina, 26 dana, 7 sati i 15 sekundi.

Algoritam za Hanojski toranj

Najฤeลกฤ‡i naฤin rjeลกavanja Hanojskog tornja je rekurzivni algoritam. Prvo, biramo dva ลกtapa kao izvor i odrediลกte; rezervni klin djeluje kao pomoฤ‡ni ili pomagaฤ.

Evo koraka za rjeลกavanje zagonetke Hanojskog tornja:

  • Pomaknite gornjih n-1 diskova s โ€‹โ€‹izvornog klina na pomoฤ‡ni klin.
  • Premjesti n-ti disk s izvornog klina na odrediลกni klin.
  • Premjestite preostalih n-1 diskova s โ€‹โ€‹pomoฤ‡nog klina na odrediลกni klin.

Biljeลกka: Ako imamo jedan disk, moลพemo ga premjestiti izravno od izvora do odrediลกta.

Kako rijeลกiti zagonetku Tower of Hanoi

Ilustrirajmo algoritam za tri diska. Razmotrimo klin A kao izvor, klin B kao pomoฤ‡nik i klin C kao odrediลกte.

Korak 1) U poฤetku su svi diskovi sloลพeni na klin A.

Rijeลกite zagonetku Tower of Hanoi

U ovoj fazi: Izvor = Peg A, Odrediลกte = Peg C, Pomoฤ‡nik = Peg B.

Sada moramo premjestiti gornjih n-1 diskova iz izvora u pomoฤ‡nik.

Biljeลกka: Iako moลพemo pomicati samo jedan disk odjednom, ovaj korak svodi naลก problem s 3 diska na problem s 2 diska, koji se rjeลกava rekurzivnim pozivom.

Korak 2) Dok vrลกimo rekurzivni poziv iz pega A s pegom B kao odrediลกtem, koristimo peg C kao pomoฤ‡nika.

Primijetite da smo se vratili u prvu fazu za isti problem Hanojske kule, ali sada za dva diska. Pomiฤemo n-1 (tj. jedan) disk od izvora do pomoฤ‡nika, ลกto pomiฤe najmanji disk s klina A na klin C.

Rijeลกite zagonetku Tower of Hanoi

U ovoj fazi: Izvor = peg A, Odrediลกte = peg B, Pomoฤ‡nik = peg C.

Korak 3) Prema algoritmu, n-ti (2.) disk se sada prenosi na odrediลกte, peg B.

Rijeลกite zagonetku Tower of Hanoi

U ovoj fazi: Izvor = peg A, Odrediลกte = peg B, Pomoฤ‡nik = peg C.

Korak 4) Sada premjeลกtamo n-1 disk (disk jedan) s pomoฤ‡nog klina C na odrediลกni klin B, slijedeฤ‡i treฤ‡u fazu algoritma.

Rijeลกite zagonetku Tower of Hanoi

U ovoj fazi: Izvor = peg A, Odrediลกte = peg B, Pomoฤ‡nik = peg C.

Korak 5) Nakon zavrลกetka rekurzivnog poziva, vraฤ‡amo se na prethodnu postavku iz prve faze algoritma.

Korak 6) U drugoj fazi, premjeลกtamo disk 3 s izvornog klina A na odrediลกni klin C.

U ovoj fazi: Izvor = peg A, Odrediลกte = peg C, Pomoฤ‡nik = peg B.

Korak 7) Sljedeฤ‡i zadatak je premjestiti preostale diskove iz pomoฤ‡nika (kolica B) u odrediลกte (kolica C). Ovaj put ฤ‡emo koristiti originalni izvor (kolica A) kao pomoฤ‡nika.

Rijeลกite zagonetku Tower of Hanoi

Korak 8) Buduฤ‡i da ne moลพemo pomicati dva diska odjednom, rekurzivno pozivamo za disk 1. Prema naลกem algoritam, odrediลกte u ovom koraku je klin A.

Rijeลกite zagonetku Tower of Hanoi

U ovoj fazi: Izvor = peg B, Odrediลกte = peg A, Pomoฤ‡nik = peg C.

Korak 9) Naลก rekurzivni poziv je zavrลกen. Sada premjeลกtamo disk 2 iz izvora u odrediลกte.

Rijeลกite zagonetku Tower of Hanoi

U ovoj fazi: Izvor = peg B, Odrediลกte = peg C, Pomoฤ‡nik = peg A.

Korak 10) Zavrลกavamo premjeลกtanjem preostalog n-1 diska (disk 1) iz pomoฤ‡nog ureฤ‘aja u odrediลกte.

Rijeลกite zagonetku Tower of Hanoi

U ovoj fazi: Izvor = peg A, Odrediลกte = peg C, Pomoฤ‡nik = peg B.

Nadimak Code za Hanojski toranj

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

Programski kod u 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;
}

Izlaz:

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

Programski kod u 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')

Izlaz:

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

Sloลพenost Hanojskog tornja

Evo vremenske i prostorne sloลพenosti Hanojskog tornja:

1) Vremenska sloลพenost:

Osvrฤ‡uฤ‡i se na algoritam, dva puta po pozivu izvrลกavamo rekurzivni poziv za (n-1) diskova. Svaka (n-1) rekurzija se rastavlja na ((n-1)-1) rekurzija i tako dalje, sve dok ne doฤ‘emo do osnovnog sluฤaja s jednim diskom.

Za tri diska:

  • Disk 3 dva puta poziva rekurzivnu funkciju za disk 2.
  • Disk 2 dva puta poziva rekurzivnu funkciju za disk 1.
  • Disk 1 se kreฤ‡e u konstantnom vremenu, ลกto daje vrijeme za rjeลกavanje za tri diska.

Izraลพeno kao ponavljanje:

= 2 ร— (Vrijeme rjeลกavanja za dva diska) + konstantno vrijeme pomicanja diska 3

= 2 ร— (2 ร— vrijeme rjeลกavanja za jedan disk + konstantno vrijeme pomicanja diska 2) + konstantno vrijeme pomicanja diska 3

= (2 ร— 2) ร— konstantno vrijeme pomicanja diska 1 + 2 ร— konstantno vrijeme pomicanja diska 2 + konstantno vrijeme pomicanja diska 3

Za n diskova, ovo postaje:

2n-1 ร— konstantno vrijeme za pomicanje diska 1 + 2n-2 ร— konstantno vrijeme za pomicanje diska 2 + โ€ฆ.

Ova geometrijska progresija se zbraja u O(2n โ€“ 1), ลกto se pojednostavljuje na O(2n), eksponencijalna vremenska sloลพenost.

2) Sloลพenost prostora:

Prostorna sloลพenost Hanojskog tornja je O(n). Rekurzija koristi stog poziva, a maksimalna dubina stoga jednaka je n, broju diskova. Zato je prostorna sloลพenost O(n).

Pitanja i odgovori

Algoritam Hanojskog tornja je rekurzivni postupak koji premjeลกta n diskova s โ€‹โ€‹izvornog na odrediลกni disk koristeฤ‡i jedan pomoฤ‡ni disk, pri ฤemu se nikada ne stavlja veฤ‡i disk na manji.

Minimalni broj poteza za n diskova je 2^n โ€“ 1. Tri diska trebaju 7 poteza, ฤetiri diska trebaju 15, a deset diskova trebaju 1,023 poteza.

Vremenska sloลพenost je O(2^n) jer svaki dodatni disk udvostruฤuje rad. Rekurentna jednadลพba T(n) = 2T(n-1) + 1 rjeลกava se na 2^n โ€“ 1, ลกto je eksponencijalno.

Prostorna sloลพenost je O(n) jer rekurzijski stog poziva sadrลพi jedan okvir za svaki disk koji se obraฤ‘uje. Maksimalna dubina rekurzije doseลพe n, pa je potrebna pomoฤ‡na memorija linearna s brojem diskova.

Da. Iterativno rjeลกenje koristi petlju s fiksnim uzorkom: na neparnim potezima cikliฤki se zamjenjuje najmanji disk izmeฤ‘u klinova, a na parnim potezima se izvodi jedini dopuลกteni potez koji nije najmanji.

Algoritam poduฤava rekurziju, modelira sheme rotacije sigurnosnih kopija za pohranu, vodi sekvenciranje robotske ruke i pojavljuje se u neuropsiholoลกkim testovima koji mjere sposobnost planiranja.

Agenti za uฤenje s potkrepljenjem rjeลกavaju Tower of Hanoi tretirajuฤ‡i svaku konfiguraciju diska kao stanje, a svaki potez kao akciju. To je uobiฤajena referentna vrijednost za planiranje i hijerarhijsko uฤenje politika.

Da. GitHub Copilot, ChatGPT i Gemini generirati rekurzivna rjeลกenja Hanojske kule u Python, C++i JavaRazvojni programeri i dalje trebaju provjeriti osnovne sluฤajeve i redoslijed argumenata.

Saลพmite ovu objavu uz: