Java implémente de manière récursive le jeu Tower of Hanoi

1. Règles

La Tour de Hanoï est un problème mathématique classique qui consiste à déplacer une pile d'assiettes d'un pilier de départ à un autre pilier d'objectif tout en le faisant avec l'aide d'un pilier intermédiaire. Voici les règles de la Tour de Hanoï :

  1. Il existe trois piliers, appelés pilier de départ, pilier d’objectif et pilier intermédiaire.
  2. Initialement, toutes les plaques sont empilées sur la colonne de départ, de la plus grande à la plus petite.
  3. Une seule assiette peut être déplacée à la fois, et seules les assiettes plus petites peuvent être placées sur des assiettes plus grandes.
  4. Pendant le mouvement, les plaques peuvent être temporairement stockées à l'aide de la colonne intermédiaire.
  5. Le but est de déplacer toutes les plaques de la colonne de départ vers la colonne cible.

2. Mise en œuvre du code

(1) Idées

Selon les règles, le problème de la Tour de Hanoï peut être résolu par récursivité. Les étapes de la solution récursive sont les suivantes :

  1. S'il n'y a qu'une seule plaque, déplacez-la directement de la colonne de départ vers la colonne cible.
  2. S'il y a plusieurs plaques, déplacez les plaques supérieures sauf celle du bas de la colonne de départ vers la colonne du milieu (à l'aide de la colonne d'objectif).
  3. Déplacez la plaque la plus basse de la colonne de départ vers la colonne cible.
  4. Déplacez la plaque précédemment déplacée vers le poteau du milieu du poteau du milieu vers le poteau cible (à l'aide du poteau de départ).

En répétant les étapes ci-dessus, toutes les plaques peuvent être déplacées de la colonne de départ vers la colonne cible, complétant ainsi le mouvement de la Tour de Hanoï.

Notez que la solution au problème des Tours de Hanoï a une complexité temporelle exponentielle, elle peut donc prendre beaucoup de temps lorsqu'il s'agit de traiter un grand nombre de plaques.

(2) Coder

public class MyClass {
    
    
   public static void main(String[] args){
    
    
       // 3 是塔的层数,a 是起始柱子,b 是中间柱,c 是目标柱
       tower(3, 'a', 'b', 'c');
   }

   //递归
   public static void tower(int num, char a, char b, char c) {
    
    
       //只有一个盘子时,直接将它从起始柱移动到目标柱
       if (num == 1) {
    
    
           System.out.println(a + " --> " + c);
       } else {
    
    
           //将除了最底下盘子以外的所有盘子视为一个,移动到中间柱
           tower(num - 1, a, c, b);
           //将最底下的盘子移动到目标柱
           System.out.println(a + " --> " + c);
           //将除了最底下盘子以外的所有盘子视为一个,移动到目标柱
           tower(num - 1, b, a, c);
       }
   }

}

(3) Complexité

  • Complexité temporelle : O(2^n), où nest le nombre de plaques.
  • Complexité spatiale : O(n). Étant donné que l'appel récursif générera la surcharge de la pile récursive, la profondeur de la récursion est de n-1.

3. Résultats en cours d'exécution

a --> c
a --> b
c --> b
a --> c
b --> a
b --> c
a --> c

Je suppose que tu aimes

Origine blog.csdn.net/qq_45256357/article/details/131965586
conseillé
Classement