La torre di Hanoi

Transcript

La torre di Hanoi
La torre di Hanoi
La Torre di Hanoi è formata da otto dischi sovrapposti, di dimensioni decrescenti, bucati al centro
e infilati in una delle tre colonnine fissate su una
tavoletta.
Gli otto dischi, che formano la cosiddetta torre,
devono poi essere spostati su una delle altre due
colonnine libere, seguendo però una regole precise:
si può spostare soltanto un disco alla volta ed è
proibito collocare uno qualsiasi dei dischi su uno
più piccolo.
L’idea è questa:
se si sa spostare una torre di
dischi, allora si sa spostare anche una torre di
dischi.
Se la torre si trova sul piolo a e la si deve spostare sul piolo b, usando anche il piolo c allora si
procede nel modo seguente.
Si sposta prima una torre di
dischi dal piolo a al piolo c,
poi un disco dal piolo a al piolo b e di nuovo una torre di
dischi da c a b.
Lo spostamento di una torre di
dischi si riduce poi a due spostamenti di torri di
dischi, e così via, fino ad arrivare a torri di un solo disco che richiedono un unico spostamento
(mossa base).
La soluzione (ricorsiva)
Per spostare N dischi dalla torre di sinistra alla torre di destra basta:
•
•
•
supporre di saper spostare gli N-1 dischi superiori dalla torre iniziale alla torre di transito;
spostare il disco rimasto sulla torre iniziale in quella di destinazione;
spostare gli N-1 dischi dalla torre di transito alla torre di destinazione.
ossia
•
•
il problema di grado N si può scomporre in due problemi di grado N-1, più una mossa
elementare
i problemi di grado N-1 possono essere affrontati nello stesso modo riducendo via via il
grado del problema. Si giungerà a dover spostare dischi singoli (mossa elementare)
La storia del gioco
http://areeweb.polito.it/didattica/polymath/htmlS/probegio/GAMEMATH/Hanoi/Hanoi.htm
Il famoso gioco in versione javascript http://www.jsdir.com/poj/hanoi/hanoi_help.htm
Attività:
Realizzare un programma modulare che preveda l’inserimento del numero dei dischi che
compongono la “Torre di Hanoi” e produca, in applicazioni console, come linee di testo, la
sequenza richiesta per risolvere il problema con effetto simile a quello illustrato:
La complessità della soluzione ricorsiva
Cercando un numero che indichi quante mosse servono per trasferire una torre di n dischi, il
contatore binario ci suggerisce l'idea che siano necessarie 2n - 1 mosse.
Dimostriamolo per induzione sulla soluzione ricorsiva:
Ipotesi induttiva:
una soluzione per una torre di n dischi si compone di 2n - 1 mosse.
Caso base:
la soluzione per la torre con un solo disco si compone di 21 - 1 = 1 mosse.
Passo induttivo:
supponendo che per risolvere una torre di p - 1 dischi occorrano 2p - 1 - 1
mosse, per una torre di p dischi occorreranno 2*(2p - 1 - 1) + 1 = 2p - 1 mosse.
Immagini tratte dal sito: http://hanoitower.mkolar.org/HThistory.html
Riproduzione del coperchio della scatola del puzzle originale
"LA TOUR D'HANOI" di Edouard Lucas
Pensiamo ….
Pensiamo alla ”Torre di Hanoi” e consideriamo il caso di
una torre con 5 dischi.
Immaginiamo di avere un amico, Four, che sa spostare le
torri di 4 dischi.
Voi e Four insieme sapete certo spostare una torre da 5
dischi.
Sappiamo infatti che Four sa spostare una torre di 4 dischi,
e lo sa fare rispettando le regole del gioco ed usando tre
pioli, quindi, per prima cosa chiedete a Four di spostare la
torre formata dai 4 dischi superiori dal piolo iniziale al piolo
intermedio.
Resta nel piolo iniziale il disco maggiore, che non ostacola il
lavoro di Four perché tutti gli altri dischi possono stare sopra
di esso.
A questo punto voi spostate il disco grande dal piolo iniziale
al piolo terminale e chiedete nuovamente a Four di
intervenire spostando la torre di 4 dischi dal piolo intermedio
a quello finale e la torre di 5 dischi si ritrova spostata come
desiderato.
Come ha fatto Four a spostare le torri di 4 dischi? Four non sa spostare le torri di 4 dischi da solo!
Four ha un amico di nome Three, che sa spostare le torri di 3 dischi e, con l’aiuto di Three, Four riesce a
spostare una torre di 4 dischi. Si usa lo stesso trucco di prima! Inutile dire che anche Three ha un amico di
nome Two, che sa spostare le torri di 2 dischi! E magari Two non sa nemmeno spostare le torri di 2 dischi e
ha bisogno dell’amico One, che sa spostare le torri formate da un solo disco!
Il genio è quello che sa spostare i singoli dischi!
Ricorsione : una versione costruttiva dell’induzione
Il principio di induzione, per poter essere applicato, richiede di aver già individuato la proprietà che si vuole
dimostrare, e non fornisce nessuno strumento per "scoprire" questa proprietà!
Ricorsione: possibilità di definire insieme infinito di oggetti con regola finita
 possibilità di descrivere un insieme infinito di computazioni
con programma finito
Il termine ricorsione indica la possibilità di descrivere un processo in termini di se stesso
Definizione ricorsiva: definizione di una classe di “oggetti” in termini di una sottoclasse degli “oggetti”
stessi.
Consiste in due fasi:
1) BASE: si definiscono uno o più “oggetti”
2) PASSO Induttivo: si definiscono altri “oggetti” a partire da quelli già definiti
Un'apparizione inattesa: il numero binario
La soluzione della Torre di Hanoi è strettamente relazionata con il sistema di numerazione binaria.
Numerando infatti i dischi in modo progressivo (1, 2, 3, 4...), ciascuna mossa della Torre di Hanoi può essere
rappresentata dal numero del pezzo che viene spostato.
In questo modo, le sette mosse necessarie alla soluzione di una torre di tre dischi possono essere indicate
semplicemente dalla successione dei numeri 1, 2, 1, 3, 1, 2, 1.
Successivamente, scrivendo i numeri binari in ordine crescente, si può osservare che tra un valore e il
successivo c'è sempre una e una sola cifra che passa da 0 a1, in qualunque delle tre possibili posizioni:
Se si annota ora la posizione che occupa tale cifra partendo da destra, si ottiene a sorpresa la successione
di mosse della Torre di Hanoi e questa relazione con il sistema binario continua ad essere valida con
qualsiasi numero di dischi.
Da http://matematicamedie.blogspot.com/2008/06/la-torre-di-hanoi-il-gioco-della-fine.html
Possibile soluzione:
/* Scrive la sequenza richiesta per risolvere il problema */
/* della "Torre di Hanoi"
*/
#include <iostream>
#include <cstdlib>
using namespace std;
unsigned long numeromosse;
/* numero di mosse */
void muovidisco (int, int);
void muovitorre (int, int, int);
int main() {
int totale;
/* numero di dischi */
cout << "Torre di Hanoi\n";
cout << "Quanti dischi? ";
cin >> totale;
numeromosse = 0;
muovitorre (totale,1,3);
cout << "\nNumero totale mosse per " << totale << " dischi = " << numeromosse << endl;
system("Pause");
return 0;
}
void muovitorre (int altezza, int partenza, int arrivo) {
/* Muove una torre di altezza pari ai dischi dalla partenza all'arrivo */
if (altezza > 0) {
int ausiliario = 6-partenza-arrivo;
muovitorre (altezza - 1,partenza,ausiliario);
muovidisco (partenza,arrivo);
muovitorre (altezza - 1,ausiliario,arrivo);
}
}
void muovidisco (int sorgente, int destinazione) {
/* Scrive e muove da sorgente a destinazione */
numeromosse++;
cout << numeromosse << ": " << sorgente << " -> " << destinazione << endl;
}