为什么 '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 - 1disc 次调用后达到值 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" 部分需要两次调用。

这是否为您澄清了什么?