python中的汉诺塔递归算法的具体运算过程是怎样的?
25 个回答
关键点:不要多想,不要像人类一样整体来看,盲人摸象即可。
以最开始提出此猜想的 [传说越南河内某间寺院有三根银棒,上串 64 个金盘] 为例。
三根银棒我们设为A,B,C。
欲将A棒上的64个金盘移动到C棒上,且大盘不能放在小盘上面。
这就如同要将大象放冰箱,共分成几步?答:3步。
1. 打开冰箱门,
2. 把大象放进去,
3. 关上冰箱门。
同理汉诺塔问题我们也需要3步,
- 将A的前63个金盘移到B, A63--->B
- 将A的第64个金盘移到C,A64th--->C(64th表示第64个盘)
- 将第一步中已经移到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步,
- 将A的前63个金盘移到B, A63--->B,可知A为初始棒,C为缓冲棒,B为目标棒
- 将A的第64个金盘移到C,A64--->C,可知A为初始棒,B为缓冲棒,C为目标棒
- 将第一步中已经移到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棒上即可。
最后用一张图来简单表示一下: