汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 规则:1.每次只移动一个盘子 2.大盘不可压小盘 (1)用递归解决汉诺塔问题 边界条件:if(n=1);x(A,C) 递归公式:if(n>1);h(n-1,A,B,C);x(A,C);h(n-1,B,A,C)
#程序实现:
n = int(input())#输入盘子的数量
def x(A,C):
print(A,"->",C)#输出盘子从A到C
def h(n,A,B,C):#有三个柱子A,B,C
if(1==n):#如果只移动一个盘子
x(A,C) #则只能从A柱移动到C柱
else:
h(n-1,A,C,B)#剩下的盘子统统从A柱移动到B柱
x(A,C)
h(n-1,B,A,C)#再从B柱上的盘子移动到C柱
h(n,"A","B","C")
移动64个盘子需要:2的64次方减一=1844亿亿次,如果每次移动用1移,需要5849亿年,主流的PC机也需要一万年。 算法计算复杂度分析: 加上一个全局变量统计移动次数,并分析计算复杂度O(2^n)。 (2)输入盘子的数量n 求多少步能搬完。
程序实现:
"""汉诺塔移动时,三个盘子要移动7步,这是固定的。当四个盘子时,它先要把最上面的三个
盘子移动到另外一根针上(这时移动了7步),然后把第四个盘子移动到另一根针上(这时共
移动了8步,三个盘子的7步加上第四个盘子的1步),最后再把那三个盘子移动到第四个盘子
上面(又是7步),所以,四个盘子要移动15步。五个盘子也是同样,我们知道了四个盘子的
移动步数是15步,那么5个盘子就是15+1+15等于31步。由此得出结论:每增加一个盘子,它
的移动步数就增加原来步数的一倍加1。如:我们已经知道5个盘子移动31步,那么,6盘子
就是31*2+1=63步"""
n=int(input())#输入盘子的数量必须不小于3
x=3#假设需要移动三个盘子
j=7#则需要七步才能搬完
while(x
j=j*2+1#计算公式
print (j)