Explication détaillée du problème de la tour de hanoi (diviser pour régner + récursivité)

        Le problème de la Tour de Hanoï a toujours été un cas classique pour l'étude des algorithmes récursifs, et il est également considéré comme un cas avancé d'algorithmes récursifs par de nombreux manuels.Aujourd'hui, nous allons nous intéresser au problème de la Tour de Hanoï !

Comprenez d'abord quel est le problème de la Tour de Hanoï :

Premièrement, il y a trois piliers :

Colonne de départ (la plus à gauche) : source
Colonne auxiliaire (la plus à droite) : helper
Colonne de destination (au milieu) : dest 

Il y a une plaque sur le pilier. Nous déplaçons les plaques gauche et droite de petite à grande et les empilons sur le pilier cible (pilier du milieu)

 Ce qui suit est l'action de mouvement

 Ensuite, ce que nous devons faire est d'écrire un algorithme, de mettre l'action de chaque mouvement dans un tableau, de laisser l'algorithme calculer comment se déplacer pour atteindre l'objectif, d'abord regarder le résultat

 regarde ça

      Array, pouvez-vous voir clairement comment ça se passe ? Même s'il y a 100 plaques, vous pouvez calculer rapidement comment procéder, suivez simplement les étapes au-dessus du tableau. 

Maintenant que nous connaissons notre objectif, écrivons le code ensemble

 Je vais d'abord montrer le code, puis expliquer

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    /** 
 * @param {圆盘数:number} plates 
 * @param {起始柱子 a:string} source 
 * @param {辅助柱子 b:string} helper 
 * @param {目标柱子 c:string} dest 
 * @param {移动步骤集:Array,数组的长度就是移动的次数} moves 
 */
    var move1 = []
    function hanoi(plates, source, helper, dest, moves = []) {
        if (plates <= 0) {
            return moves;
        }
        if (plates === 1) {
            moves.push([source, dest]);
            move1.push([source, dest, helper]);
        } else {
            hanoi(plates - 1, source, dest, helper, moves);
            moves.push([source, dest]);
            hanoi(plates - 1, helper, source, dest, moves);
        }
        return moves;
    }

    // test
    console.log(hanoi(5, 'source', 'helper', 'dest')); // 输出结果如下图展示
</script>
</html>

 Le plus difficile c'est les deux appels récursifs dans le else. Ce n'est pas facile à expliquer. J'ai fait une photo pour aider à comprendre !

 

La Tour de Hanoï au 5ème étage est trop grande, donc ce n'est pas facile de faire une capture d'écran. J'ai mis un 4ème étage. En fait, le principe est le même. 

Le 4ème étage est 2 à la quatrième puissance -1, qui est 15 fois ;

Le 5ème étage est 2 à la 5ème puissance -1, et 31 fois sont obtenus ;


 

Ce n'est pas facile à comprendre et cela prend du temps. J'ai travaillé dessus toute la nuit, puis j'ai dessiné l'image. Si vous êtes intéressé, vous pouvez m'en parler en privé et en discuter ensemble. S'il y a quelque chose qui ne va pas, vous êtes les bienvenus pour guider !

Je suppose que tu aimes

Origine blog.csdn.net/fightingLKP/article/details/126254841
conseillé
Classement