javascript – Crockford的河内功能(来自“好的部分”)

前端之家收集整理的这篇文章主要介绍了javascript – Crockford的河内功能(来自“好的部分”)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

参见英文答案 > How does recursive algorithm work for Towers of Hanoi?                                    2个
目前我正在阅读道格拉斯·克罗克福德(Douglas Crockford)的书,而且河内功能的塔楼有点过头了.即使将日志记录到控制台,我也无法真正了解正在发生的事情.这是我添加功能

var hanoi = function (disc,src,aux,dst) {
  console.log(disc);
  console.log(src,dst);    
  if (disc > 0) {
    hanoi(disc - 1,dst,aux);
    console.log('Move disc ' + disc + ' from ' + src + ' to ' + dst);
    hanoi(disc - 1,dst);
  }
}

hanoi(3,'Src','Aux','Dst');

这导致以下结果:

3
Src Dst
2
Src Aux
1
Src Dst
0
Src Aux
Move disc 1 from Src to Dst
0
Aux Dst
Move disc 2 from Src to Aux
1
Dst Aux
0
Dst Src
Move disc 1 from Dst to Aux
0
Src Aux
Move disc 3 from Src to Dst
2
Aux Dst
1
Aux Src
0
Aux Dst
Move disc 1 from Aux to Src
0
Dst Src
Move disc 2 from Aux to Dst
1
Src Dst
0
Src Aux
Move disc 1 from Src to Dst
0
Aux Dst

而且我很早就输了.在结果的第6行,它怎么能从Src Aux回到Src Dst?

一旦它达到0,当该功能仅使用“disc-1”调用自身时,光盘的数量怎么能再次上升?

最佳答案
产生混淆是因为输出的文本表示不是理解递归的最佳方式.光盘的数量不是“上升”,而是在河内(0)完成后继续运行的河内(1).

我在JSBin创建了一个修改过的例子,用一些(有些)更漂亮的方式用空格打印输出.只有“移动”实际上做了什么,其余的行只是递归调用,以解决较小的子问题,以便以后解决整个问题.

您可能还想查看此Java applet,它以图形方式显示算法的工作原理 – 这可能更容易理解.

猜你在找的JavaScript相关文章