next up previous contents index
suivant: Les permutations circulaires monter: Les programmes récursifs précédent: Les palindromes   Table des matières   Index

Les tours de Hanoï

Une tour de Hanoï est composée de p disques de rayons différents que l'on numérote de 1 à p selon l'ordre croissant des rayons (le plus petit disque a le numéro 1 et le plus gros le numéro p). On dispose de 3 plots numérotés de 1 à 3.
Au départ les disques sont empilés selon l'ordre croissant sur le plot 1.
Le jeu consiste à reconstituer la tour sur le plot 2, en se servant du plot 3 comme plot intermédiaire, en déplacant les disques un à un, et en posant toujours un disque sur un disque plus petit que lui.
Par exemple, on peut mettre le dique 2 sur le disque 5, mais pas sur le disque 1.
On veut écrire un programme qui imprime ce qu'il faut faire comme manipulations : ce sera tour(a,b,c,p), où p représente le nombre de disques, où a représente le plot de départ, où b représente le plot d'arrivée, et où c représente le plot intermédiaire.
On tapera alors par exemple :
tour(1,2,3,4)
si on a une tour de 4 disques sur le plot 1, et qu'on veut la reconstituer sur le plot 2 par l'intermédiaire du plot 3.
Les manipulations à faire sont récursives, en voici les étapes:
- iL faut arriver à dégager le disque p pour qu'il soit seul sur le plot 1 avec les p - 1 disques sur le plot 3, le plot 2 étant vide et prêt à recevoir le dique p. Dans cette situation, il y une tour de p - 1 disques sur le plot 3. Cela veut dire que l'on est arrivé à reconstituer la tour constituée des p - 1 premiers disques sur le plot 3, en se servant du plot 2 comme plot intermédiaire.
Avec les notations ci dessus c'est que l'on a effectué :
tour(a,c,b,p-1)
c'est l'instruction qui permet de reconstituer une tour de p - 1 disques sur le plot 3 en partant du plot 1 et en se servant du plot 2 comme plot intermédiaire.
- on déplace ensuite le disque p du plot 1 sur le plot 2 :
print("deplacer le disque ",p," de ", a , " vers", b).
- il reste à reconstituer la tour de p - 1 disques sur le plot 2 en partant du plot 3 et en se servant du plot 1 comme plot intermédiaire.
Il faut donc effectuer :
tour(c,b,a,p-1)
-il reste à trouver le test d'arrêt qui est simplement (p==0) c'est à dire : quand on a une tour de zéro disque on ne fait rien (on renvoie 0).
On tape dans un éditeur de programmes (que l'on ouvre avec Alt+p), puis on le teste et le valide avec OK :
//tour(1,2,3,4) (tour de hanoi)
//depacement des p disques de a vers b en passant par c
tour(a,b,c,p) :={
  if (p==0) return 0;
  tour(a,c,b,p-1);
  print("deplacer le disque ",p," de ", a , " vers", b);
  tour(c,b,a,p-1);
  return 0;
}


next up previous contents index
suivant: Les permutations circulaires monter: Les programmes récursifs précédent: Les palindromes   Table des matières   Index
Documentation de giac écrite par Renée De Graeve