Explicación detallada del problema de la torre de hanoi (divide y vencerás + recursividad)

        El problema de la Torre de Hanoi siempre ha sido un caso clásico para el estudio de algoritmos recursivos, y muchos libros de texto también lo consideran un caso avanzado de algoritmos recursivos. ¡Hoy veremos el problema de la Torre de Hanoi!

Primero comprenda cuál es el problema de la Torre de Hanoi:

En primer lugar, hay tres pilares:

Columna de inicio (más a la izquierda): fuente
Columna auxiliar (más a la derecha): ayudante
Columna de destino (en el medio): dest 

Hay un plato en el pilar. Movemos los platos izquierdo y derecho de pequeño a grande y los apilamos en el pilar de destino (pilar del medio)

 La siguiente es la acción de movimiento.

 Luego, lo que tenemos que hacer es escribir un algoritmo, poner la acción de cada movimiento en una matriz, dejar que el algoritmo calcule cómo moverse para lograr el objetivo, primero mirar el resultado

 mira este

      Array, ¿puedes ver claramente cómo va? Incluso si hay 100 platos, puede calcular rápidamente cómo hacerlo, simplemente siga los pasos que se encuentran arriba de la matriz. 

Ahora que conocemos nuestro objetivo, escribamos el código juntos

 Primero mostraré el código, luego explicaré

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

 Lo más difícil son las dos llamadas recursivas en el else. Esto no es fácil de explicar. ¡Hice una imagen para ayudar a entender!

 

La Torre de Hanoi en el quinto piso es demasiado grande, por lo que no es fácil tomar una captura de pantalla. Puse un cuarto piso. De hecho, el principio es el mismo. 

El 4to piso es 2 elevado a la cuarta potencia -1, que es 15 veces;

El 5to piso es 2 elevado a la 5ta potencia -1, y se obtienen 31 veces;


 

Esto no es fácil de entender y lleva tiempo. Trabajé en ello toda la noche y luego dibujé la imagen. Si está interesado, puede enviarme un mensaje privado y discutirlo juntos. Si hay algo mal, puede guiarlo.

Supongo que te gusta

Origin blog.csdn.net/fightingLKP/article/details/126254841
Recomendado
Clasificación