我正在阅读Douglas Crockford的'JavaScript:The Good Parts'。在一个致力于递归的小部分中,他提出了一个着名的“河内之塔”之谜,以及在JS中使用prezents'简单'的简单递归解决方案。
引用:
河内之塔是一个着名的谜题。该设备包括三个 柱子和一组各种直径的圆盘,其中有孔 中心。安装程序堆叠源文件夹上的所有光盘 较大光盘顶部的较小光盘。目标是将堆栈移动到 目标帖子通过一次将一张光盘移动到另一个帖子, 切勿将较大的光盘放在较小的光盘上。这个谜题有一个 琐碎的递归解决方案:
var hanoi = function (disc, src, aux, dst) {
if (disc > 0) {
hanoi(disc - 1, src, dst, aux);
document.writeln('Move disc ' + disc +
' from ' + src + ' to ' + dst);
hanoi(disc - 1, aux, src, dst);
}
};
hanoi(3, 'Src', 'Aux', 'Dst');
代码是这样的输出:
将光盘1从Src移到Dst
将光盘2从Src移动到Aux
将光盘1从Dst移动到Aux
将光盘3从Src移动到Dst
将光盘1从Aux移动到Src
将光盘2从Aux移动到Dst
将光盘1从Src移到Dst
这当然是解决这个难题的正确动作序列,但说实话,这个递归代码对我来说似乎很神奇。我一直试图把它分成更小的部分并理解它,但这很难。
hanoi
函数并将disc
参数设置为3
时立即提取1(得到2); 2
- 我没有看到任何添加。如果有人解释了这个小片段背后的逻辑,我会非常感激,这样我才能最终获得递归。