La Torre di Hanoi (anche conosciuta come Torre di Lucas dal nome del suo inventore) è un rompicapo matematico composto da tre paletti e un certo numero di dischi di grandezza decrescente, che possono essere infilati in uno qualsiasi dei paletti.
Il gioco inizia con tutti i dischi incolonnati su un paletto in ordine decrescente, in modo da formare un cono. Lo scopo del gioco è portare tutti i dischi su un paletto diverso, potendo spostare solo un disco alla volta e potendo mettere un disco solo su un altro disco più grande, mai su uno più piccolo.
Origini
[modifica | modifica wikitesto]Il gioco fu inventato nel 1883[1] dal matematico francese Édouard Lucas che diffuse il gioco sotto lo pseudonimo di N. Claus de Siam, mandarino del collegio di Li-Sou-Stian.[2] La leggenda secondo la quale in un tempio Indù alcuni monaci sono costantemente impegnati a spostare su tre colonne di diamante 64 dischi d'oro secondo le regole della Torre di Hanoi (a volte chiamata Torre di Brahmā) è stata inventata dalla ditta che per prima ha messo in commercio il rompicapo. La leggenda narra che quando i monaci avranno completato il lavoro il mondo finirà.
Esistono anche versioni videoludiche del rompicapo.[3][4][5][6]
Soluzione
[modifica | modifica wikitesto]La proprietà matematica base è che il numero minimo di mosse necessarie per completare il gioco è , dove n è il numero di dischi (ad esempio, per spostare 3 dischi il numero minimo di mosse è 7). Di conseguenza secondo la leggenda, in cui , i monaci di Hanoi dovrebbero effettuare almeno = 18.446.744.073.709.551.615 mosse prima che il mondo finisca. In altri termini, anche supponendo che i monaci facciano una mossa al secondo, il mondo finirebbe tra 5.845.580.504 secoli.[7][8]
La soluzione generale è data dall'algoritmo seguente.
Algoritmo ricorsivo
[modifica | modifica wikitesto]La soluzione base del gioco della torre di Hanoi si formula in modo ricorsivo.[9][10]
Siano i paletti etichettati con A, B e C, e i dischi numerati da 1 (il più piccolo) a n (il più grande). L'algoritmo si esprime come segue:
- Sposta i primi n-1 dischi da A a B. (Questo lascia il disco n da solo sul paletto A)
- Sposta il disco n da A a C
- Sposta n-1 dischi da B a C
Per spostare n dischi si richiede di compiere un'operazione elementare (spostamento di un singolo disco) ed una complessa, ossia lo spostamento di n-1 dischi. Tuttavia anche questa operazione si risolve nello stesso modo, richiedendo come operazione complessa lo spostamento di n-2 dischi. Iterando questo ragionamento si riduce il processo complesso ad uno elementare, ovvero lo spostamento di n-(n-1)=1 disco.
Questo è un algoritmo ricorsivo,[9] di complessità esponenziale.
L'implementazione in linguaggio C dell'algoritmo è stata pubblicata sul numero 3 di hitzone[11].
È interessante notare che il rompicapo è risolvibile per qualsiasi "n", con una dimostrazione per ricorrenza: Supponiamo di avere una torre in A composta da N dischi, e supponiamo che N sia il numero massimo di dischi ammessi per risolvere il gioco. Al termine dello spostamento della torre da A a B, aggiungiamo un ulteriore disco ad A, di grandezza pari a N+1, e ipotizziamo che questo disco sia stato fermo tutto il tempo sotto gli altri. A questo punto, spostiamo semplicemente il disco da A a C, e certamente riusciremo a spostare la torre da B a C, seguendo gli stessi passaggi che si sono resi necessari per spostarla da A a B. Avendo dimostrato che una torre di N dischi è spostabile da una colonna all'altra, è dimostrato che si può spostare anche una torre di N+1 dischi.
Soluzione iterativa
[modifica | modifica wikitesto]Una soluzione semplice per il gioco è alternare le mosse tra il disco più piccolo e un disco diverso dal più piccolo. Quando muovi il disco più piccolo, spostalo sempre nella posizione successiva nella stessa direzione (a destra se il numero iniziale di dischi è pari, a sinistra se il numero iniziale di dischi è dispari). Se non c'è una torre sulla quale spostare il disco nella direzione scelta, sposta il pezzo all'estremità opposta, ma poi continua a muoverti nella direzione corretta. Ad esempio, se hai iniziato con tre dischi, sposta il disco più piccolo all'estremità opposta, quindi continua verso sinistra. Quando devi muovere un disco diverso dal più piccolo, resta solo una mossa consentita. In questo modo completerai il gioco nel minor numero di mosse possibile.[12]
Procedura più semplice per la soluzione iterativa
[modifica | modifica wikitesto]Per un numero pari di dischi:
- Fai la mossa consentita tra i paletti A e B (in entrambe le direzioni),
- Fai la mossa consentita tra i paletti A e C (in entrambe le direzioni),
- Fai la mossa consentita tra i paletti B e C (in entrambe le direzioni),
- Ripeti fino al completamento.
Per un numero dispari di dischi:
- Fai la mossa consentita tra i paletti A e C (in entrambe le direzioni),
- Fai la mossa consentita tra i paletti A e B (in entrambe le direzioni),
- Fai la mossa consentita tra i paletti B e C (in entrambe le direzioni),
- Ripeti fino al completamento.
Dopo ogni mossa controlla se il paletto C è completo. In ogni caso, vengono effettuate in totale 2n − 1 mosse.
Soluzione iterativa equivalente
[modifica | modifica wikitesto]Un altro modo per generare l'unica soluzione iterativa ottimale:
Numera i dischi da 1 a n (dal più grande al più piccolo).
- Se n è dispari, la prima mossa è dal paletto A al paletto C.
- Se n è pari, la prima mossa è dal paletto A al paletto B.
Ora, aggiungi questi vincoli:
- Nessun disco dispari può essere posizionato direttamente su un disco dispari.
- Nessun disco pari può essere posizionato direttamente su un disco pari.
- A volte ci saranno due possibili paletti su cui spostare il disco: uno avrà i dischi e l'altro sarà vuoto. Sposta il disco sul paletto non vuoto.
- Non spostare mai lo stesso disco due volte di seguito.
Rispettando questi vincoli dopo la prima mossa, c'è solo una mossa consentita per ogni turno successivo.
La sequenza di queste mosse uniche è una soluzione ottimale al problema equivalente alla soluzione iterativa descritta sopra.[13]
Problema generalizzato
[modifica | modifica wikitesto]Il problema può essere generalizzato, supponendo ad esempio che il numero dei paletti non sia fissato a tre ma genericamente estendibile.
Supposta tale generalizzazione sono noti esempi di strategie ottimali per il completamento del gioco, sotto specifiche ipotesi, fin dal 1941. Esse sono state trovati separatamente da diversi autori.
La dimostrazione che tali strategie sono quelle ottimali in ogni condizione è invece un risultato del 2017. La principale difficoltà della dimostrazione era implicata dalla non unicità, nel caso con più di tre paletti, della strategia ottimale da seguire durante la risoluzione. Nel caso generale, di fatti, dopo ogni mossa è possibile cambiare strategia pur restando nel numero minimo di quelle necessarie a risolvere il puzzle, creando un complesso albero di percorsi risolutivi che impiegano lo stesso numero minimo di passi per risolvere il problema. Tale non unicità non è da intendersi nell'ovvio senso delle permutazioni, ma nel modo più generale possibile.[14]
Note
[modifica | modifica wikitesto]- ^ (EN) Lucas summary, su www-history.mcs.st-and.ac.uk.
- ^ (EN) The Tower of Hanoi, su cs.wm.edu.
- ^ (EN) Hanoi: Sega Dreamcast Game Console (Animated), su kernelthread.com (archiviato dall'url originale il 24 dicembre 2010).
- ^ (EN) Hanoi: Nintendo Gameboy Advance Handheld (Animated), su kernelthread.com (archiviato dall'url originale il 24 dicembre 2010).
- ^ Francesco Sblendorio, Torri di Hanoi per MS-DOS & Windows, su sblendorio.eu, 1996.
- ^ (EN) Francesco Sblendorio, Towers of Hanoi - CP/M generic version and C128 specific, su github.com, 2015.
- ^ (EN) eZine, Hitnote 0x03, su Neperos, 1º settembre 2020. URL consultato il 28 febbraio 2023.
- ^ Progetto Polymath - La torre di Hanoi, su areeweb.polito.it.
- ^ a b (EN) Tower of Hanoi, su cut-the-knot.org.
- ^ Daniela Romagnoli, La Torre di Hanoi : che cosa c’e sotto un noto rompicapo. (PDF), su matematica.unito.it. URL consultato il 2023 febbraio 21.
- ^ (EN) eZine, Hitnote 0x03, su Neperos, 1º settembre 2020. URL consultato il 10 dicembre 2022.
- ^ (EN) M. Troshkin, Doomsday Comes: un'analisi non ricorsiva del problema ricorsivo delle torri di Hanoi, in Focus, vol. 95, n. 2, pp. 10–14.
- ^ Herbert Mayer e Don Perkins, Torri di Hanoi Rivisitato, in SIGPLAN Avvisi, vol. 19, n. 2, 1984, pp. 80–84, DOI:10.1145/948566.948573.
- ^ (EN) Roberto Demontis, What is the least number of moves needed to solve the k-peg Towers of Hanoi problem? (PDF), su arxiv.org, 23 settembre 2013.
Bibliografia
[modifica | modifica wikitesto]- Martin Gardner, Il gioco dell'icosaedro e la torre di Hanoi, in Enigmi e giochi matematici, Milano, Rizzoli, 2001 [1959], ISBN 88-17-12747-7.
Voci correlate
[modifica | modifica wikitesto]- Test della torre di Londra, test di tipo neuropsicologico con similarità al rompicapo
- Problema del lupo, della capra e dei cavoli
- Torre di Babele
Altri progetti
[modifica | modifica wikitesto]- Wikimedia Commons contiene immagini o altri file sulla Torre di Hanoi
Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Tower of Hanoi / Lucas’ Puzzle, su Enciclopedia Britannica, Encyclopædia Britannica, Inc.
- (EN) Eric W. Weisstein, Torre di Hanoi, su MathWorld, Wolfram Research.
- (EN) Denis Howe, Towers of Hanoi, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
- Tomasi Alessandra, Torre di Hanoi - Gioco, su geogebra.org.
- (EN) Hanoimania, più di 100 implementazioni del problema della Torre di Hanoi, su kernelthread.com. URL consultato il 21 novembre 2004 (archiviato dall'url originale l'11 febbraio 2004).
- (EN) Tower of Hanoi (3-10 pedine, HTML dinamica)
- Gioco sulle Torri di Hanoi, su giochieflash.it.
- Programma in C Risolutivo Algoritmo Torri di Hanoi, su digilander.libero.it.
- Prestazioni di PHP, JavaScript, Ruby, Java e C++ a confronto nella soluzione della Torre di Hanoi, su marcovisona.it.
- Gioco Torri di Hanoi max 8 pedine, su comunedasa.it.
- Torri di Hanoi per MS-DOS & Windows, su sblendorio.eu.
- (EN) Towers of Hanoi - CP/M version, su github.com.
- Playable Tower of Hanoi in BASIC for Olivetti M10 / Tandy TRS-80 Model 100, su github.com.