'''
汉诺塔个数>1,即至少有两个
从上往下对盘标号为1~n
对于2的情况,把1从A移到B,再把2从A移到C,最后把1从B移到C
对于n>2我们把第n个,因为最大,可以看做底盘,所以只需要把1~n-1从A移到B,再把n从A移到C,最后把1~n-1从B移到C
这样就形成了递归关系,代码如下
注意不要被ABC误导了,我们的最终目标是以A为起点,B为中介,C为终点;而在移动1~n-1时,A是起点,C是中介,B是终点。ABC只是代表地点而已
'''
def move (n, from_, to):
print(f"move {n} from {from_} to {to}")
def hano(n, A, B, C):
'''
n: 个数
A: 起点
B: 中介
C: 终点
'''
if n==2:
move(n-1, A, B)
move(n, A, C)
move(n-1, B, C)
else:
hano(n-1, A, C, B)
move(n, A, C)
hano(n-1, B, A, C)
hano(5, 'A', 'B', 'C')
# 2.步数的计算
'''
f(n)=f(n-1) + 1 + f(n-1)
即 f(n)=2f(n-1)+1
构造为 f(n)+1=2[f(n-1)+1]
用等比数列计算得到f(n)的通项公式 f(n)=2**n - 1
或者move函数 加个计步的全局变量,move一下加一下
'''
|