我对河内之塔的递归解决方案感到困惑,该解决方案在每次递归调用时递减光盘参数,而不是从 disc 的启动值开始,也不会在之后结束递归光盘通话量。
在光盘电话数量之后,光盘 - 1 是否应达到 0 的值?魔术师在这个优雅的伎俩手中在哪里?为什么每个新调用似乎都在使用自己的 disc 值而不是原始参数?
function hanoi(disc, src, dst, aux) {
if (disc === 0) {
var disk = src.pop();
dst.push(disk);
} else {
hanoi(disc-1, src, aux, dst);
var disk = src.pop();
dst.push(disk);
hanoi(disc-1, aux, dst, src);
}
}
hanoi(10, [10, 9, 8, 7, 6, 5, 4, 3, 2, 1], [], []);
答案 0 :(得分:1)
因子是线性递归。河内的塔是一个双递归:每个更深层次需要每次被调用2次递归。因此,移动 N 磁盘需要 2 ^ N - 1 总移动。
该算法的内容如下:
如果这是最大的磁盘: 把它移到目的地挂钩;现在我们已经完成了。
否则: 将下一张光盘移到第三个钉子上; 把这个移到目的地挂钩; 将下一个磁盘移动到目标挂钩;
这是"否则"需要两个电话的部分。
这能为你澄清什么吗?