python简单练习:递归解决汉尼塔问题

**

汉尼塔

**
这是个比较常见的问题 我就直接说了,应该都懂。

我们如何用递归解决这个问题呢?我们又如何完全解决这一类问题?基本情况又是什么?让我 们从递归调用的最底端入手。假设你有一个五个圆盘组成的塔,最开始在一号杆上。如果你已经知 道如何将有四个圆盘的小塔从一号杆移到二号杆,就可以很容易地将第五个圆盘移动到三号杆,然后将 四个圆盘的塔从二号杆移动到三号杆。但是如果你不知道如何移动有四个圆盘的塔呢?这时又假设 你知道如何将有三个圆盘的塔移到三号杆;然后你就可以将第四个圆盘移动到二号杆,然后再将位 于三号杆的有三个圆盘的塔移到其上。但是如果你不知道如何移动有三个圆盘的小塔又怎么办呢? 那考虑先将有两个圆盘的小塔移动到二号杆,再将第三个圆盘移动到三号杆,最后将两个圆盘的小塔移 动到三号杆会如何呢?但如果你连这个也不会,该如何处理?显然你知道将单个圆盘移到三号杆十 分简单甚至可以说无需思考,似乎这就是这一问题最基础的部分。

话不多说,直接上代码:

count = 0
def hanoi(n, src, dst, mid):
    '''
       n:圆盘数量
       src:原柱子
       mid:过渡柱子
       dst:目标柱子
       '''
    global count
    if n == 1:
        print('{}号圆盘:{}->{}'.format(n,src,dst))
        '''将1号圆盘从原柱子移到目标柱子
        '''
        count += 1
    else:
        hanoi(n-1, src, mid, dst)
        '''改变形参位置,原过渡柱子成为新的目标柱子,
                         原目标柱子成为新过渡柱子
        '''
        print('{}号圆盘:{}->{}'.format(n,src,dst))
        '''将原柱子最上面的n-1号圆盘放到目标柱子上
        '''
        count += 1
        hanoi(n-1,mid,dst,src)
        '''改变形参位置,原目标柱子成为新原始柱子,
                         原原始柱子成为新过渡柱子'''
hanoi(5,'a','b','c')
print(count)

运行结果

1号圆盘:a->b
2号圆盘:a->c
1号圆盘:b->c
3号圆盘:a->b
1号圆盘:c->a
2号圆盘:c->b
1号圆盘:a->b
4号圆盘:a->c
1号圆盘:b->c
2号圆盘:b->a
1号圆盘:c->a
3号圆盘:b->c
1号圆盘:a->b
2号圆盘:a->c
1号圆盘:b->c
5号圆盘:a->b
1号圆盘:c->a
2号圆盘:c->b
1号圆盘:a->b
3号圆盘:c->a
1号圆盘:b->c
2号圆盘:b->a
1号圆盘:c->a
4号圆盘:c->b
1号圆盘:a->b
2号圆盘:a->c
1号圆盘:b->c
3号圆盘:a->b
1号圆盘:c->a
2号圆盘:c->b
1号圆盘:a->b
31

进程已结束,退出代码 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Franda914

有钱的捧个钱场,没钱的点的赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值