Hanoi

Vedi la discussione

Algoritmo ricorsivo…

Fibonacci

Vedi la discussione

Versione ricorsiva…


Versione iterativa

Ricorsione

Se il linguaggio di programmazione prevede la ricorsione… una SUB A può chiamare la SUB A, se stessa, per svolgere lo stesso compito ma con un’stanza diversa

ricorsione

La SUB A chiama la SUB A … finché non succede qualcosa (l’istanza diventa un caso particolare che non necessita di un’ulteriore chiamata ricorsiva) e si ritorna all’indietro fino alla prima chiamata…

Procedura Funzione
Basic
C…
Pascal

Ricorsione indiretta

Nel caso di ricorsione indiretta il sottoprogramma chiama un secondo sottoprogramma che a sua volta … che a sua volta chiama il primo

La torre di Hanoi

Il problema

Nel tempio di Brahma si trova una piattaforma di ottone con tre perni di diamanti.
Sul primo di tali perni sono infilati 64 dischi d’oro, di dimensioni decrescenti, che formano una torre.
Si deve portare la torre sul terzo perno, spostando un solo disco alla volta e in modo che mai un disco di diametro maggiore si trovi sopra un disco di diametro minore.
Per risolvere la questione si può utilizzare il secondo perno come perno di servizio.

Quando i monaci termineranno l’opera il mondo sarà finito!

Analisi

Siano D1, D2, …, Dn le etichette dei dischi di una torre di Hanoi con n dischi.

n Prova! Analisi
1

Il problema con un solo disco è banale

  1. il disco è sinistra
  2. sposta il disco D1 dalla 1° alla 3° torre
2

Se i dischi sono 2 le mosse sono 3

  1. i dischi sono a sinistra
  2. sposta il disco D1 dalla 1° alla 2° torre
  3. sposta il disco D2 dalla 1° alla 3° torre
  4. sposta il disco D1 dalla 2° alla 3° torre
3

Se i dischi sono 3 le mosse sono 7

  1. i dischi sono a sinistra
  2. sposta il disco D1 dalla 1° alla 3° torre
  3. sposta il disco D2 dalla 1° alla 2° torre
  4. sposta il disco D1 dalla 3° alla 2° torre
  5. sposta il disco D3 dalla 1° alla 3° torre
  6. sposta il disco D1 dalla 2° alla 1° torre
  7. sposta il disco D2 dalla 2° alla 3° torre
  8. sposta il disco D1 dalla 1° alla 3° torre

Se i dischi sono 4, 5, … si può riconoscere lo schema risolutivo

  1. i dischi sono a sinistra
  2. sposta i dischi D1…Dn-1 dalla 1° alla 2° torre (usando la 3° come appoggio) in modo da liberare Dn
  3. sposta il disco Dn dalla 1° alla 3° torre
  4. sposta i dischi D1…Dn-1 dalla 2° alla 3° torre (usando la 1° come appoggio) sopra Dn

Algoritmo

Ad ogni passo è sufficiente specificare

  • il numero di dischi coinvolti, perché si parla sempre dei dischi in cima a una torre
  • il nome della torre di origine
  • il nome della torre di appoggio
  • il nome della torre di destinazione

allora l’algoritmo risolutivo per il problema

Hanoi(n, origine, appoggio, destinazione)

diventa

  1. Hanoi(n-1, origine, arrivo , appoggio)
  2. Hanoi(1, origine, appoggio, destinazione)
  3. Hanoi(n-1, appoggio, origine, destinazione)

con l’accortezza che nel caso di torre con un solo disco è sufficiente comunicare di spostare il disco dalla torre origine alla torre destinazione.

Prova!

La soluzione è costituita da una sequenza di coppie

a >> b

di spostamenti dalla torre a alla torre b.

La complessità dell'algoritmo

Dopo aver analizzato il problema decidiamo che il tempo di esecuzione dell'algoritmo è proporzionale al numero di spostamenti di dischi

  • T(1) = 1
  • T(2) = T(1)+T(1)+T(1) = 1+1+1 = 3
  • T(3) = T(2)+T(1)+T(2) = 3+1+3 = 7
  • T(4) = T(3)+T(1)+T(3) = 7+1+7 = 15
  • ...
  • T(n) = T(n-1)+T(1)+T(n-1) = 2*T(n-1)+1
  • ...

Numericamente si tratta della successione

1, 3, 7, 15, 31, 63, 127, ...

cioè

21-1, 22-1, 23-1, 24-1, 25-1, 26-1, 27-1, ...

quindi

T(n) = 2n-1

I tempi necessari per risolvere il problema sono

n T(n) = 2n-1 1 Hz (uomo) 1 GHz (PC)
1 21-1 = 1 un secondo 10-9 s
2 22-1 = 3 3 secondi 3*10-9 s
10 210-1 = 1023 ~17 minuti ~10-6 s
20 220-1 = 1.048.575 ~12 giorni ~10-3 s
30 230-1 = 1.073.741.823 ~34 anni ~1 s
64 264-1 = 18.446.744.073.709.551.615 ~5*1011 anni ~500 anni

Conclusioni

  • L'algoritmo per il problema della torre di Hanoi ha complessità in tempo asintotica esponenziale, O(2n)
  • Non può esistere un algoritmo con complessità minore
  • Il problema della torre di Hanoi è un problema intrinsecamente esponenziale
  • Il problema della torre di Hanoi è un problema intrattabile!

Quick sort

Un algoritmo di ordinamento

  • molto complicato: ricorsivo e difficile da ricordare
  • ma ottimo: è quasi sempre molto veloce…