Adloun

programmation Java (école d'ingénieur) · Chapitre 4 · Exercice de TD

Tours de Hanoï

Méthodes · niveau 3 (difficile)

Énoncé

Trois piquets A, B, C ; disques de tailles différentes sont empilés sur A, du plus grand en bas au plus petit en haut. Il faut les déplacer sur C, un disque à la fois, sans jamais poser un disque sur un plus petit.

  • Expliquer pourquoi, pour déplacer disques de A vers C, il suffit de déplacer disques de A vers B, puis le plus grand de A vers C, puis les disques de B vers C.
  • Écrire la méthode récursive static void hanoi(int n, char depart, char arrivee, char intermediaire) qui affiche les déplacements, et l'exécuter pour .
  • Combien de déplacements pour disques ? Le vérifier par le programme pour .

Corrigé

  • Pour poser le plus grand disque sur C, il faut que C soit vide et que ce disque soit seul sur A : les autres sont donc tous sur B. On les y amène (problème de taille , B jouant le rôle d'arrivée), on déplace le grand disque, puis on ramène les disques de B sur C (encore un problème de taille ). Le grand disque, en bas, ne gêne jamais. -

static void hanoi(int n, char depart, char arrivee, char intermediaire) {
    if (n == 0) return;                                  // rien à déplacer
    hanoi(n - 1, depart, intermediaire, arrivee);
    System.out.println("  disque " + n + " : " + depart + " -> " + arrivee);
    hanoi(n - 1, intermediaire, arrivee, depart);
}

  disque 1 : A -> C
  disque 2 : A -> B
  disque 1 : C -> B
  disque 3 : A -> C
  disque 1 : B -> A
  disque 2 : B -> C
  disque 1 : A -> C
  • Si est le nombre de déplacements, et , d'où . Le programme compte pour . Pour disques, à un déplacement par seconde, il faudrait près de milliards d'années.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →