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; }