为什么'光盘'河内塔的价值在“盘子”中没有减少到0。通话量?

时间:2016-02-04 19:51:42

标签: javascript recursion towers-of-hanoi

我对河内之塔的递归解决方案感到困惑,该解决方案在每次递归调用时递减光盘参数,而不是从 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], [], []);

1 个答案:

答案 0 :(得分:1)

因子是线性递归。河内的塔是一个双递归:每个更深层次需要每次被调用2次递归。因此,移动 N 磁盘需要 2 ^ N - 1 总移动。

该算法的内容如下:

如果这是最大的磁盘:   把它移到目的地挂钩;现在我们已经完成了。

否则:   将下一张光盘移到第三个钉子上;   把这个移到目的地挂钩;   将下一个磁盘移动到目标挂钩;

这是"否则"需要两个电话的部分。

这能为你澄清什么吗?