Adloun

Probleme – Les tours de Hanoï : le compte, la borne, la pile

Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 5 — Récursivité

Énoncé

Trois piquets , , ; disques de tailles distinctes empilés sur , du plus grand au plus petit. On déplace un disque à la fois, et jamais un disque sur un plus petit. On veut tout amener sur .

Corrigé

1. La fonction.


(* hanoi n a b c affiche les deplacements amenant les n disques du
   piquet a au piquet c, en se servant de b comme intermediaire.
   Precondition : n >= 0, et a, b, c deux a deux distincts. *)
let rec hanoi n a b c =
  if n > 0 then begin
    hanoi (n-1) a c b;                        (* les n-1 petits : a --> b *)
    Printf.printf "disque %d : %s -> %s\n" n a c;   (* le grand : a --> c *)
    hanoi (n-1) b a c                         (* les n-1 petits : b --> c *)
  end

Pour , mesuré : 1:A->C, 2:A->B, 1:C->B, 3:A->C, 1:B->A, 2:B->C, 1:A->C, soit sept déplacements.

Le point de méthode est le saut de confiance de la méthode du cours : on ne déroule pas les appels, on suppose donnée la solution pour disques et l'on s'en sert deux fois. La légalité est immédiate : pendant que les petits voyagent, le disque est le plus grand et ne gêne personne ; quand il bouge, les deux autres piquets utiles sont libres.

2. Le compte. Soit le nombre de déplacements. La fonction en fait avec . En posant , il vient et , donc et

Mesuré : pour , puis pour et pour — soit exactement à chaque fois.

3. La borne inférieure. Soit le nombre minimal de déplacements, toutes stratégies confondues. Pour amener le disque de sur , il faut qu'à cet instant ne porte que lui et que soit vide : les autres sont donc tous sur . Il a donc fallu au préalable amener disques de à , ce qui coûte au moins ; puis au moins un déplacement pour le disque ; puis amener les disques de à , encore au moins . D'où , et par récurrence . Comme l'algorithme atteint cette valeur, il est optimal et .

Ce raisonnement mérite d'être savouré : il ne parle d'aucun algorithme, seulement de ce que la règle du jeu impose. C'est la première borne inférieure du livre, et le chapitre chap:diviser en donnera d'autres.

4. La pile. L'arbre des appels est binaire, complet, de hauteur : il a nœuds internes, mais sa hauteur est . La profondeur de pile est donc , et le temps .

Non, ce ne sont pas la même grandeur, et c'est le point du problème. Pour , la machine ouvre au plus blocs d'activation — dérisoire — et fait déplacements — plusieurs heures. La mémoire n'est jamais le problème de Hanoï ; le temps l'est toujours. La confusion inverse est fréquente : on croit qu'un algorithme exponentiel en temps l'est aussi en mémoire. Le cours le dit en une phrase que ce problème illustre : la hauteur de l'arbre donne l'espace, le nombre de nœuds donne le temps.

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.