汉诺塔百度百科链接
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
先考虑1–3个盘的情况,再考虑多个盘的情况
3个盘的情况还较简单,但是盘再多就很复杂了。于是我们需要一个更简单的办法,在上述3个盘的情况下,我们可以发现,其实2个盘的情况还是很简单的。所以可以使用数学中的抽象法,将3个盘抽象成两个盘,具体方法如下;
再用数学归纳法,扩展到n个盘子的情况:
如此,还剩一个问题就是,那上面n-1个盘子怎么移?
在上面的数学归纳法中,我们在移动的时候,压根没有考虑上面的n-1个盘是怎么移的。
我们先换个思路,我们把A柱 上面n-1个盘当成一个整体时,A柱让最下面那个盘就是最大的,游戏规则是允许小盘在大盘上,所以我们是否可以先当这个最大的盘不存在,然后先考虑n-1个盘怎么移动到C柱上?
如此一来,是不是规模就变小了一次。但是解决问题的办法还是一样的方法,所以我们一直重复利用这个方法,直到只剩下1个盘的时候就比较简单了。
编写一段python 代码,使用函数,让用户指定盘的数量,打印出将所有盘片从A移到C柱上的所有步骤
将A柱上的n个盘片从A柱借助B柱移动到C柱上
如果 只有一盘片:
则直接从A柱上移动到C柱上
否则
先将n-1个盘片从A柱上借用C柱移动到B柱上
再将A柱上的最后一个盘片移动到C柱上
最后将B柱上的n-1个盘片借助A移动到C上
def TowerOfHanoi(n,A,B,C):#n个盘在A柱上,借用B柱的空闲移到C柱上
if n == 1:#如果只有一个盘,
print(A ,"==>", C)#则直接从A移到C上
else:#否则
TowerOfHanoi(n-1,A,C,B) #先将n-1个盘从A柱上利用C柱移动到B柱上
print(A,"==>",C) #再将A上的最后一移到C柱上
TowerOfHanoi(n-1,B,A,C) #最后将B柱上的n-1个盘借助A柱的空闲移动到C柱上
TowerOfHanoi(int(input("Please input how much disc in A pillar.we will tell you how to move the disc:")),"A","B","C")
Please input how much disc in A pillar.we will tell you how to move the disc:1
A ==> C
Please input how much disc in A pillar.we will tell you how to move the disc:2
A ==> B
A ==> C
B ==> C
Please input how much disc in A pillar.we will tell you how to move the disc:3
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C
Please input how much disc in A pillar.we will tell you how to move the disc:4
A ==> B
A ==> C
B ==> C
A ==> B
C ==> A
C ==> B
A ==> B
A ==> C
B ==> C
B ==> A
C ==> A
B ==> C
A ==> B
A ==> C
B ==> C
Please input how much disc in A pillar.we will tell you how to move the disc:5
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C
A ==> B
C ==> B
C ==> A
B ==> A
C ==> B
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C
B ==> A
C ==> B
C ==> A
B ==> A
B ==> C
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C