ハノイタワー問題の詳細解説(分割統治+再帰)

        ハノイの塔問題は、常に再帰アルゴリズムを研究するための古典的なケースであり、多くの教科書で再帰アルゴリズムの高度なケースと見なされています. 今日は、ハノイの塔問題を見ていきます!

まず、ハノイの塔問題とは何かを理解してください。

まず、3 つの柱があります。

開始列 (左端): ソース
補助列 (右端): ヘルパー
宛先列 (中央): dest 

柱の上に板があります左右の板を小さいものから大きいものへ動かし、目的の柱(中柱)に重ねます

 以下は移動アクションです

 次に、アルゴリズムを作成し、各動きのアクションを配列に入れ、アルゴリズムに目標を達成するためにどのように動くかを計算させ、最初に結果を確認する必要があります

 これを見て

      アレイ、様子がよくわかる?100枚のプレートがあっても、配列の上の手順に従うだけで、どのように進むべきかをすばやく計算できます。 

目標がわかったので、一緒にコードを書きましょう

 最初にコードを示してから説明します

<!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>

 最も難しいのは、else の 2 つの再帰呼び出しです. これは説明するのが簡単ではありません. 理解を助けるために絵を作りました!

 

5階のハノイの塔は大きすぎてスクリーンショットが撮りにくいので4階にしましたが、原理は同じです。 

4 階は 2 の 4 乗 -1 で、15 倍です。

5 階は 2 の 5 乗 -1 で、31 回得られます。


 

これは理解するのが簡単ではありません, 時間がかかります. 一晩中作業してから絵を描きました. 興味がある場合は, 私をプライベートにして一緒に話し合うことができます. 何か問題がある場合は, ガイドしてください!

おすすめ

転載: blog.csdn.net/fightingLKP/article/details/126254841