JS递归的例子:'河内之塔'之谜

时间:2015-05-28 20:54:40

标签: javascript recursion

我正在阅读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

这当然是解决这个难题的正确动作序列,但说实话,这个递归代码对我来说似乎很神奇。我一直试图把它分成更小的部分并理解它,但这很难。

  1. 我不明白为什么第一个打印的语句是“将光盘1从Src移到Dst”,当调用hanoi函数并将disc参数设置为3时立即提取1(得到2);
  2. 如果它最初成为1,为什么它在第二个声明“将光盘2从Src移到Aux”再次升为2 - 我没有看到任何添加。
  3. 如果有人解释了这个小片段背后的逻辑,我会非常感激,这样我才能最终获得递归。

0 个答案:

没有答案