汉诺塔问题-python实现-高级算法设计与分析-递归与分治章节

汉诺塔(必考)

规则

  1. 每次只能移动一共盘
  2. 任何时刻都不能将大的圆盘放小圆盘上
  3. 满足1 2的情况下可以随便移动
  4. 目标:把a上的盘移到b

探索汉诺塔的规则

我们先从简单的1个盘,2个盘,3个盘来探索下汉诺塔的过程
假设圆盘在a柱上从上到下的初始编号为1~n

  1. 当个数为1时候 移动步骤为

    • 第一步:1号盘 a->b
  2. 当个数为2时候 移动步骤为

    • 第一步:1号盘 a->b
    • 第二步:2号盘 a->c
  3. 当个数为3时候 移动步骤为

    • 第一步:1号盘 a->b
    • 第二步:2号盘 a->c
    • 第三步:1号盘 b->c
    • 第四步:3号盘 a->b
    • 第五步:1号盘 c->a
    • 第六步:2号盘 c->b
    • 第七步:1号盘 a->b

规则如下:

  • 奇数步骤(斜体) 最小的圆盘如下次序移动 a->b->c->a
  • 偶数步骤:在其他两个塔之间把较小的圆盘移动 比如上次a->b 那么较小的一定是在a 所以a->c 如果上次c->a 下次一定c->b

知道了规则就轻轻松松了,思考下下面的步骤就行了

自顶向下思路:

  • n个圆盘时候一定是分为三步
  • 我们定义hannoi(n,a,b,c)的含义是把n个圆盘从a移动到c借助b
    1. 把a柱上面n-1个盘借助b移动到c

    hannoi(n-1,a,c,b)

    1. 把a柱上最大的移动到b

    Move(a,b)

    1. 循环1 2 两步 此时 n-1个最小盘在c上 我们只要把c当作a即可

    hannoi(n-1,c,b,a)

python代码实现

"""
这里先定义一个二维的列表
方便以后打印输出过程
"""
n=3
a,b,c=['a',[3,2,1]],['b',[]],['c',[]]
def Move(a,b,is_print):#从a移动到b  is_print 是否打印过程
    a_ele=a[-1].pop()
    b[-1].append(a_ele)
    if is_print:
        print("{} from {}--->{}".format(a_ele,a[0],b[0]))
def hanoi(n,a,b,c):#hanoi表示从a上的n个圆盘移动到b 借助c
    if n>0:
        hanoi(n-1,a,c,b)
        Move(a,b,is_print=True)
        hanoi(n-1,c,b,a)
hanoi(n,a,b,c)

运行结果如下

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值