为什么 'disc' 中的 Towers of Hanoi 值在 'disc' 调用次数中没有减少到 0?
Why does the 'disc' value in Towers of Hanoi not decrement to 0 in 'disc' amount of calls?
我对河内塔的递归解决方案感到困惑,它在每次递归调用时递减 disc 参数,而不是从 disc[= 的初始值开始24=] 也不会在 disc 次调用后结束递归。
不应 disc - 1 在 disc 次调用后达到值 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], [], []);
阶乘是线性递归。 Towers of Hanoi 是一个双重递归:每个更深的层次每次调用都需要 2 次递归。因此,移动 N 个磁盘需要 2^N - 1 总移动次数。
算法是这样读的:
如果这是最大的磁盘:
将其移动到目标挂钩;现在我们完成了。
否则:
将下一个圆盘向下移动到第三个挂钩;
将此移动到目标挂钩;
将下一个磁盘移动到目标挂钩;
正是这个 "otherwise" 部分需要两次调用。
这是否为您澄清了什么?
我对河内塔的递归解决方案感到困惑,它在每次递归调用时递减 disc 参数,而不是从 disc[= 的初始值开始24=] 也不会在 disc 次调用后结束递归。
不应 disc - 1 在 disc 次调用后达到值 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], [], []);
阶乘是线性递归。 Towers of Hanoi 是一个双重递归:每个更深的层次每次调用都需要 2 次递归。因此,移动 N 个磁盘需要 2^N - 1 总移动次数。
算法是这样读的:
如果这是最大的磁盘: 将其移动到目标挂钩;现在我们完成了。
否则: 将下一个圆盘向下移动到第三个挂钩; 将此移动到目标挂钩; 将下一个磁盘移动到目标挂钩;
正是这个 "otherwise" 部分需要两次调用。
这是否为您澄清了什么?