Torre di Hanoi

Vedi la discussione

Con le assegnazioni

  • n = numero di dischi
  • sorgente = la torre sorgente, dove si trovano i dischi inizialmente
  • temp = la torre temporanea, di appoggio
  • destinazione = la torre destinazione, dove i dischi devono essere spostati
def hanoi(n, sorgente, temp, destinazione):
    if n == 1:
        print(sorgente, ">>", destinazione)
    else:
        hanoi(n-1, sorgente, destinazione, temp        )
        hanoi(1  , sorgente, temp        , destinazione)
        hanoi(n-1, temp    , sorgente    , destinazione)

n=int(input("Quanti dischi? "))
hanoi(n, 1, 2, 3)

Al variare del numero di dischi (1, 2, …, 10, …) come cambia il tempo di esecuzione della funzione?

Contare 1

Conta il numero di spostamenti

conta=0

def hanoi(n, sorgente, temp, destinazione):
    global conta
    if(n == 1):
        conta += 1
        # print(...)
    else:
        hanoi(n-1, sorgente, destinazione, temp        )
        hanoi(1  , sorgente, temp        , destinazione)
        hanoi(n-1, temp    , sorgente    , destinazione)

n=int(input("Quanti dischi? "))
hanoi(n,1,2,3)
print(conta)

Contare 2

Utilizza la funzione time.time() per avere il numero di secondi necessari per l’esecuzione del codice.
Elimina la print() per risparmiare tempo (a mali estremi estremi rimedi…)

import time

def hanoi(n, sorgente, temp, destinazione):
    if(n == 1):
        pass  # non fare niente...
        # print(...)
    else:
        hanoi(n-1, sorgente, destinazione, temp        )
        hanoi(1  , sorgente, temp        , destinazione)
        hanoi(n-1, temp    , sorgente    , destinazione)

n=25
START=time.time()  # Orario prima di cominciare
hanoi(n,1,2,3)
STOP=time.time()   # Orario dopo aver finito
print(STOP-START)  # Tempo trascorso in secondi

Per n > 25 i tempi diventano comunque insostenibili (secondi -> minuti -> ore …)