Algoritmo della Torre di Hanoi: Python, C++ Code
โก Riepilogo intelligente
L'algoritmo della Torre di Hanoi รจ un classico rompicapo ricorsivo che consiste nello spostare una pila di dischi tra tre pioli senza mai posizionare un disco piรน grande sopra uno piรน piccolo, illustrando chiaramente il principio del "divide et impera".

Cos'รจ la Torre di Hanoi?
La Torre di Hanoi รจ un rompicapo matematico composto da tre aste e una pila di dischi di dimensioni decrescenti sovrapposti. ร nota anche come Torre di Brahma o Torre di Lucas, dal nome del matematico francese รdouard Lucas, che la introdusse nel 1883. Il rompicapo si basa su leggende riguardanti dischi d'oro che si muovevano tra le tre aste.
Questo rompicapo รจ composto da tre aste e un numero variabile di dischi impilati. Le aste sono disposte a formare delle torri cicliche, in modo che i dischi piรน grandi siano impilati alla base e quelli piรน piccoli in cima.
Inizialmente, ci vengono forniti tre pioli o aste. Su una di esse (il piolo A nell'esempio) sono impilati tutti i dischi. L'obiettivo รจ spostare l'intera pila da un'asta (A) a un'altra (C) rispettando alcune regole specifiche.
Ecco la configurazione iniziale del puzzle:
Problema della Torre di Hanoi
E questo รจ l'obiettivo finale:
Regole della Torre di Hanoi
Ecco le regole essenziali per la Torre di Hanoi:
- Nella configurazione iniziale del puzzle, tutti i dischi sono impilati sull'asta numero uno.
- Nella configurazione finale, tutti i dischi provenienti dalla prima asta sono impilati sulla seconda o sulla terza asta.
- In un dato momento, un solo disco puรฒ spostarsi da un'asta all'altra.
- Solo il disco piรน in alto su un'asta puรฒ essere spostato.
- Non รจ possibile posizionare un disco sopra un disco piรน piccolo.
La leggenda originale riguardava lo spostamento di 64 dischi. I sacerdoti potevano spostare un disco alla volta, secondo le regole. Secondo la leggenda, esisteva una profezia secondo cui il mondo sarebbe finito se fossero riusciti a completare l'atto. Nella sezione sulla complessitร temporale, mostreremo che una configurazione della Torre di Hanoi con n dischi richiede 2^n โ 1 mosse.
Quindi, se i sacerdoti avessero impiegato 1 secondo per spostare un disco, il tempo totale per risolvere il puzzle sarebbe stato di 2^64 โ 1 secondo, ovvero circa 584,942,417,356 anni, 26 giorni, 7 ore e 15 secondi.
Algoritmo per la Torre di Hanoi
Il metodo piรน comune per risolvere la Torre di Hanoi รจ un algoritmo ricorsivo. Innanzitutto, scegliamo due aste come sorgente e destinazione; il piolo di riserva funge da ausiliario o di supporto.
Ecco i passaggi per risolvere il puzzle della Torre di Hanoi:
- Sposta i primi n-1 dischi dal piolo di origine al piolo di supporto.
- Sposta l'n-esimo disco dal perno di origine al perno di destinazione.
- Spostare i restanti n-1 dischi dal perno di supporto al perno di destinazione.
Nota: Se disponiamo di un singolo disco, possiamo spostarlo direttamente dalla sorgente alla destinazione.
Come risolvere il puzzle della Torre di Hanoi
Illustriamo l'algoritmo per tre dischi. Consideriamo il piolo A come sorgente, il piolo B come supporto e il piolo C come destinazione.
Passo 1) Inizialmente, tutti i dischi sono impilati sul perno A.
In questa fase: Sorgente = Picchetto A, Destinazione = Picchetto C, Ausiliario = Picchetto B.
Ora dobbiamo spostare i primi n-1 dischi dall'origine all'helper.
Nota: Sebbene possiamo spostare un solo disco alla volta, questo passaggio riduce il nostro problema a 3 dischi a un problema a 2 dischi, che viene gestito tramite una chiamata ricorsiva.
Passo 2) Poichรฉ effettuiamo una chiamata ricorsiva dal peg A con il peg B come destinazione, utilizziamo il peg C come supporto.
Si noti che siamo tornati alla prima fase dello stesso problema della Torre di Hanoi, ma ora con due dischi. Spostiamo n-1 (ovvero un) disco dalla sorgente all'aiutante, che sposta il disco piรน piccolo dal piolo A al piolo C.
In questa fase: Sorgente = piolo A, Destinazione = piolo B, Ausiliario = piolo C.
Passo 3) Secondo l'algoritmo, l'n-esimo (2ยฐ) disco viene ora trasferito alla destinazione, piolo B.
In questa fase: Sorgente = piolo A, Destinazione = piolo B, Ausiliario = piolo C.
Passo 4) Ora, spostiamo il disco n-1 (disco uno) dal perno ausiliario C al perno di destinazione B, seguendo la terza fase dell'algoritmo.
In questa fase: Sorgente = piolo A, Destinazione = piolo B, Ausiliario = piolo C.
Passo 5) Dopo aver completato la chiamata ricorsiva, torniamo all'impostazione precedente, ovvero alla prima fase dell'algoritmo.
Passo 6) Nella seconda fase, spostiamo il disco 3 dal perno di origine A al perno di destinazione C.
In questa fase: Sorgente = piolo A, Destinazione = piolo C, Ausiliario = piolo B.
Passo 7) Il prossimo compito รจ spostare i dischi rimanenti dal supporto (perno B) alla destinazione (perno C). Questa volta useremo la sorgente originale (perno A) come supporto.
Passo 8) Poichรฉ non possiamo spostare due dischi contemporaneamente, effettuiamo una chiamata ricorsiva per il disco 1. Secondo il nostro algoritmo, la destinazione in questa fase รจ il piolo A.
In questa fase: Sorgente = piolo B, Destinazione = piolo A, Ausiliario = piolo C.
Passo 9) La nostra chiamata ricorsiva รจ completa. Ora spostiamo il disco 2 dalla sua origine alla sua destinazione.
In questa fase: Sorgente = piolo B, Destinazione = piolo C, Ausiliario = piolo A.
Passo 10) Concludiamo spostando il restante n-1 disco (disco 1) dal dispositivo di supporto a quello di destinazione.
In questa fase: Sorgente = piolo A, Destinazione = piolo C, Ausiliario = piolo B.
Soprannome Code per la Torre di 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
Codice del programma inserito 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; }
Produzione:
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
Codice del programma inserito 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')
Produzione:
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
Complessitร della Torre di Hanoi
Ecco la complessitร spazio-temporale della Torre di Hanoi:
1) Complessitร temporale:
Riesaminando l'algoritmo, effettuiamo una chiamata ricorsiva per (n-1) dischi due volte per ogni chiamata. Ogni (n-1) ricorsione si scompone in ((n-1)-1) ricorsioni, e cosรฌ via, fino a raggiungere il caso base a disco singolo.
Per tre dischi:
- Il disco 3 richiama due volte la funzione ricorsiva del disco 2.
- Il disco 2 richiama due volte la funzione ricorsiva del disco 1.
- Il disco 1 si muove in tempo costante, dando il tempo necessario per risolvere il problema dei tre dischi.
Espresso come ricorrenza:
= 2 ร (Tempo necessario per risolvere per due dischi) + tempo costante per spostare il disco 3
= 2 ร (2 ร tempo per risolvere per un disco + tempo costante per spostare il disco 2) + tempo costante per spostare il disco 3
= (2 ร 2) ร tempo costante per spostare il disco 1 + 2 ร tempo costante per spostare il disco 2 + tempo costante per spostare il disco 3
Per n dischi, questo diventa:
2n-1 ร tempo costante per spostare il disco 1 + 2n-2 ร tempo costante per spostare il disco 2 + โฆ.
Questa progressione geometrica si somma a O(2n โ 1), che si semplifica in O(2n), una complessitร temporale esponenziale.
2) Complessitร spaziale:
La complessitร spaziale della Torre di Hanoi รจ O(n). La ricorsione utilizza lo stack delle chiamate e la profonditร massima dello stack รจ pari a n, il numero di dischi. Ecco perchรฉ la complessitร spaziale รจ O(n).










