python中的汉诺塔递归算法的具体运算过程是怎样的?

def move(n,a,b,c): if n==1: print(a,'->',c) else: move(n-1,a,c,b) move(1,a,…
关注者
210
被浏览
118,077

25 个回答

具体过程见下图,用Axure画的计算流程图,被知乎瓦力折叠了,知乎的人工智能有待于提高。

最后推荐一本Python教科级别的工具书,可随时查阅,也可作为镇宅之宝。

千万记得买第三版的,py2快完淘汰了。

这本书讲的很基础,互联网时代,很多书看电子版就行。但是我个人认为,手边还是要备一本基础工具书作为查漏补缺的。

上边Axure画的图也是看了基础教程的书想明白了,也可能是查了很多资料的储备后,然后恰好到看到这本书悟透了,总之,这是很奇妙的过程。

关键点:不要多想,不要像人类一样整体来看,盲人摸象即可。

以最开始提出此猜想的 [传说越南河内某间寺院有三根银棒,上串 64 个金盘] 为例。

三根银棒我们设为A,B,C。

欲将A棒上的64个金盘移动到C棒上,且大盘不能放在小盘上面。

这就如同要将大象放冰箱,共分成几步?答:3步。

1. 打开冰箱门,

2. 把大象放进去,

3. 关上冰箱门。

同理汉诺塔问题我们也需要3步,

  1. 将A的前63个金盘移到B, A63--->B
  2. 将A的第64个金盘移到C,A64th--->C(64th表示第64个盘)
  3. 将第一步中已经移到B的63个金盘移到C,B63--->C

当然这是不能实现的,但是我们可以发现,第二步是很简单的,一下即可完成的(将A棒剩下的最后一个大盘移到目标棒上),而第一步和第三步是可以继续拓展的。比如我们先单独看第一步,此时目标变成了

欲将A棒上的63个盘移动到B

在回头看看我们的初始目标:

欲将A棒上的64个盘移动到C

区别只有盘的数目和移动目标,从C棒变成了B棒。

而这可以通过迭代+参数变换即可达到。


同理第三步,

目标:

欲将B棒上的63个盘移动到C

在回头看看我们的初始目标:

欲将A棒上的64个盘移动到C

区别只有盘的数目和初识棒,从A棒变成了B棒。

而这可以通过迭代+参数变换即可达到。


这里有个重要的点要说明一下,如果我们真的动手去玩这个游戏也会发现,即使是最简单的n=3,即A棒上有3个金盘,欲移动到C棒上也需要B棒的辅助,B棒相当于一个缓冲的作用。如果将这句话提取一下,就是除了初始棒和目标棒,我们依然需要一个缓冲棒。而这三个棒在函数中的参数位置为(n,初始棒,缓冲棒,目标棒)。


我们重新来回顾一下这3步,

  1. 将A的前63个金盘移到B, A63--->B,可知A为初始棒,C为缓冲棒,B为目标棒
  2. 将A的第64个金盘移到C,A64--->C,可知A为初始棒,B为缓冲棒,C为目标棒
  3. 将第一步中已经移到B的63个金盘移到C,B63--->C,可知B为初始棒,A为缓冲棒,C为目标棒


以上三步即为else中

move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)

的由来。

层层迭代,直到最后n==1时,A棒上只剩最后一个盘,没有任何疑问的移动到C棒上即可。

最后用一张图来简单表示一下: