双汉诺塔及其时间复杂度

河北工程大学算法分析与设计作业

 

#双汉诺塔
#作者:单手打字
#河北工程大学信电学院
#原问题,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步,与程序执行结果相符合,使用其他数字也符合.

结果如下:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值