河北工程大学算法分析与设计作业
#双汉诺塔
#作者:单手打字
#河北工程大学信电学院
#原问题,2n个盘子从A到C,B为辅助
count = 0#执行步骤计数
def DoubleHanoi(N,source='A',target='C',help='B'):
"""N=2n,N是所有盘子的数量,source为原始柱子,target为目标柱子,help为辅助柱子"""
global count
if N == 2:#递归出口,最后两个
print(N,'from',source,'to',target,' help:',help)
print(N-1,'from',source,'to',target,' help:',help)
count += 2
return 0#结束出口
DoubleHanoi(N-2,source=source,target=help,help=target)#原问题递归分解为2n-2个上面的盘子从A到B,此时C为辅助
print(N,'from',source,'to',target,' help:',help)
print(N-1, 'from', source, 'to', target, ' help:',help)
count += 2#步数加2
DoubleHanoi(N-2,source=help,target=target,help=source)
N = int(input('请输入双汉诺塔盘子总数(偶数)'))
DoubleHanoi(N,'A','C','B')
print('共执行',count,'步')
#递归实现伪代码
#原问题:2n个盘子 从A移到B,C是辅助
#子问题1:上面的2n-2个盘子 先从A到C,B为辅助
#中间步骤:把最下面的2个盘子从A依次移到B
#子问题2:2n-2个盘子 从C移到B,A为辅助
#移动次数 T(2n) = 2*T(2n-2) +O(2) #2**1*T(2n-2*1) + (2**1-1)*O(2)
# = 2*(2*T(2n-4) + O(2)) + O(2)
# = 2**2*T(2n-4) + 3*O(2) #2**2*T(2n-2*2) + (2**2-1)*O(2)
# = 2**2*(2*T(2n-6) + O(2)) + 3*O(2)
# = 2**3*T(2n-6) + 7*O(2) #2**3*T(2n-2*3) + (2**3-1)*O(2)
# ...
# = 2**(n-1)*T(2n-2(n-1)) + (2**(n-1)-1)*O(2)
# = 2**(n-1)*T(2) + (2**(n-1)-1)*O(2)
# = 2**n + 2**n -2
# = 2**(n+1) -2 #O(2**n)
#当n=2 也就是N=2n=4时,共有2**(2+1)-2 = 6步,与程序执行结果相符合,使用其他数字也符合.
结果如下: