汉诺塔实验

汉诺塔实验以n=1时移动步骤:
    第一步:	A-->C
以n=2时移动步骤:
    第一步:A-->B
    第二步: A-->C
    第三步: B-->C
以n=3时移动步骤(上图)

我们可以看出A-->C这一步是移动的核心,即:A将最大的盘子移动到C。
我们可以这么说:
            A-->C以上均是A借助C将n-1个盘子移动到B。核心是A-->B
            A-->C以下均是B借助A将n-1个盘子移动到C。核心是B-->C

这时你会发现n不管为几时最终都会在一个核心步骤上分为上下两个大步骤,然后这两个大步骤在以某个核心分为两个大步骤。最终归结为一个步骤。这样我们就可以用递归进行调用。

 以下为python代码

##汉诺塔实验室(版本一)
def hannuota(n,A,B,C):
    if n == 1:
        move1(1, A,C)
    else:
        hannuota(n-1,A,C,B)
        move1(n,A,C)#核心这一步没有判断直接输出
        hannuota(n-1,B,A,C)

def move1(n,A,C):
    print('编号:%d从%s移动到%s' % (n,A,C))
#版本二
hannuota(4,'A','B','C')
def move(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
        move(n-1,a,c,b)
        move(1,a,b,c)#核心这一步还要判断,如果这里是n当n=2时move(n-1,a,c,b)走完这一步走 #move(2,a,b,c)此时n=2就陷入了死循环
        move(n-1,b,a,c)

move(4, 'A', 'B', 'C')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值