js实现汉诺塔移动过程
汉诺塔问题简介
汉诺塔是一个经典的递归问题,涉及将一组盘子从一个柱子移动到另一个柱子,遵循规则:每次只能移动一个盘子,且大盘子不能放在小盘子上面。
实现思路
使用递归方法可以简洁地描述汉诺塔的移动过程。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(只有一个盘子时直接移动)。

代码实现
function hanoi(n, source, target, auxiliary) {
if (n === 1) {
console.log(`Move disk 1 from ${source} to ${target}`);
return;
}
hanoi(n - 1, source, auxiliary, target);
console.log(`Move disk ${n} from ${source} to ${target}`);
hanoi(n - 1, auxiliary, target, source);
}
// 示例:移动3个盘子,从柱子A到柱子C,借助柱子B
hanoi(3, 'A', 'C', 'B');
代码解析
-
参数说明:
n:盘子的数量。source:起始柱子。target:目标柱子。auxiliary:辅助柱子。
-
递归逻辑: 当盘子数量为1时,直接将盘子从起始柱子移动到目标柱子。 盘子数量大于1时,先将上方
n-1个盘子从起始柱子移动到辅助柱子,再将第n个盘子移动到目标柱子,最后将n-1个盘子从辅助柱子移动到目标柱子。
输出示例
调用hanoi(3, 'A', 'C', 'B')的输出如下:
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
可视化改进
若需动态展示移动过程,可结合HTML和CSS实现动画效果,或使用setTimeout分步打印移动步骤。
function delayedHanoi(n, source, target, auxiliary, delay) {
if (n === 1) {
setTimeout(() => {
console.log(`Move disk 1 from ${source} to ${target}`);
}, delay);
return delay + 1000;
}
let newDelay = delayedHanoi(n - 1, source, auxiliary, target, delay);
setTimeout(() => {
console.log(`Move disk ${n} from ${source} to ${target}`);
}, newDelay);
newDelay += 1000;
return delayedHanoi(n - 1, auxiliary, target, source, newDelay);
}
// 示例:每步间隔1秒
delayedHanoi(3, 'A', 'C', 'B', 0);





