Les tours de Hanoï
Exercice · informatique (tronc commun des prépas scientifiques), chapitre 6 — Fonctions récursives
Énoncé
Écrire la fonction récursive hanoi(n, depart, via, arrivee) affichant les étapes de déplacement de disques de la tige de départ à la tige d'arrivée. Déterminer le nombre exact de déplacements et prouver son optimalité.
Corrigé
def hanoi(n: int, depart: str, via: str, arrivee: str) -> None:
if n == 0:
return
hanoi(n - 1, depart, arrivee, via)
print(depart, "->", arrivee)
hanoi(n - 1, via, depart, arrivee)
Le nombre de déplacements obéit à la relation de récurrence , avec , ce qui donne déplacements. Preuve d'optimalité : Pour dégager le disque le plus grand, les disques supérieurs doivent impérativement être empilés sur la tige intermédiaire, nécessitant au moins mouvements. Après le déplacement du grand disque ( mouvement), il faut déplacer à nouveau les disques de la tige intermédiaire vers la tige finale ( mouvements). On a donc , ce qui démontre qu'aucun algorithme ne peut effectuer moins de déplacements.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.