一、这是一道非常经典的练习题。

问题描述如下:


现在有 n 个圆盘从上往下从小到大叠在第一根柱子上,要把这些圆盘全部移动到


第三根柱子要怎么移动,汉诺塔问题的以下几个限制条件:


1.在小圆盘上不能放大圆盘。


2.在三根柱字之间一回只能移动一个圆盘。


3.只能移动在最顶端的圆盘。




如何输入圆盘的个数,输出移动的过程呢?




二、这种问题肯定是使用递归算法。我们可以想象最简单的模型,三个圆盘。


过程是这样的:三个圆盘按大小命名为为大、中、小。


1.现将A柱上的三个圆盘中的小圆盘放在C柱上。A--->C


2.再将A柱上的中圆盘放在B柱上。A--->B


3.再将C上的小圆盘放在B柱上。C---->B


4.再将A柱上剩余的大圆盘放在C柱上。A---->C


5.再将B柱上面的小圆盘放在A柱上。B---->A


6.再将B柱上面的中圆盘放在C柱上。B---->C


7.再将A柱上面的小圆盘放在C柱上。A----->C




三、再拓展到4个圆盘:小、中、大、超大


1.将A柱上的小、中、大三个圆盘放到B柱。为了不破坏从大到小的规则,所以需要借助C柱。


2.再将剩下超大圆盘放到C柱。(完成1个圆盘了)


3.此时A柱是空的,B柱上有三个圆盘,所以此时的A柱就变成了B柱,B柱变成了A柱。


4.在重复移动三个圆盘的过程就可以了。





python函数 汉诺塔 python求解汉诺塔问题_python


 我们可以看到这其实是一个循环,知识第一块和第二块的第四次移动开始不同,是反过来的。



四、再拓展到n个圆盘:


1.将A柱上n-1个圆盘借助C柱移动到B柱。


2.将A柱上最大的一个圆盘放到C柱。此时完成了一个圆盘,剩下就是处理n-1个圆盘的问题了。


3.此时n-1个圆盘在B柱,A柱是空的。


4.依旧是借助C柱(因为C柱上面是最大的圆盘,可以放剩下n-1圆盘的任意一个)将n-2个圆盘移动到A柱。这个过程就是将A,B两个柱的功能进行了互换。




五、总结流程:


1.借助C柱现将除最大圆盘外的其他圆盘从A移动到B。(a, c, b)


2.当剩余一个圆盘时,将圆盘从A移动到C(a, b, c)


3.此时b柱有圆盘,A柱为空,调换A,B柱的功能。(b, a, c)




六、代码:


def move(n, a='A', b='B', c='C'):
    if n == 1:
        print('移动{}的一个圆盘到{}'.format(a, c))
        return
    move(n-1, a, c, b) # 移动n-1个盘子,从a移动到b,借助c
    move(1, a, b, c) # 剩下一个盘子从a移动到c
    move(n-1, b, a, c) # 将柱子b上的n-1个圆盘,借助a柱(此时a柱为空),移动到c
floor = int(input('请输入圆盘层数:'))
move(floor)

以上理解仅供参考,欢迎指正!