Corrigé
On suppose que l'on a les trois emplacements de tours A, B et C ; et que l'on veuille déplacer les disques de la tour A vers la tour C.
- pour pouvoir déplacer le plus grand disque de la tour A, il faut avoir déplacé tous les disques au-dessus de lui. Comme c'est le plus grand disque, il est de plus seul sur son emplacement
- une fois le plus grand disque seul sur sa tour, il faut le déplacer en C (ce disque peut être en B ou en A)
- une fois le plus grand disque à sa place, il convient de déplacer la tour formée des autres disques sur l'emplacement C.
Si
- déplacer une tour de
éléments : de complexité - déplacer un disque : de complexité
- re-déplacer une tour de
éléments : de complexité
On a donc l'inégalité : hanoï(départ, arrivée, intermédiaire, n-1)
pour une tour de taille
hanoï(A, B, C, n-1)
- déplace le disque restant en A sur l'emplacement C
hanoï(B, C, A, n-1)
On obtient alors l'algorithme optimal suivant, en considérant que les tours sont des listes :
A = list(range(5, -1, -1))
B = []
C = []
def hanoi(départ, arrivée, intermédiaire, n):
if n == 0:
return
hanoi(départ, intermédiaire, arrivée, n-1)
disque = départ.pop()
arrivée.append(disque)
print(A, B, C)
hanoi(intermédiaire, arrivée, départ, n-1)
print(A, B, C)
hanoi(A, C, B, len(A))
On a montré que notre stratégie était optimale. Le nombre d'opérations de déplacement suit alors l'équation de récurrence :
Et la terminaison :
On obtient facilement l'expression, pour
La somme des