递归问题—汉诺塔

        今天在廖雪峰老师的网站上学习python,里面讲到递归问题,最后的练习题是汉诺塔问题。很早以前就知道这个故事,还有在棋盘上放麦粒的故事,但是一直都没有主动去了解过,今天特地在网上搜了搜。因为我太笨了,实在想不出来像这种问题还能用程序编出来。知乎上有一个大神讲的很清楚,在这里我把我今天学到的提炼总结一下:

        一共有三根柱子,标号为A,B,C,在A柱子上有n个盘子,我们要把A柱子上的所有盘子都移动到C柱子上,可以借助B柱子,在移动的过程中有两个基本原则:一、一次只能移动一个盘子,二、所有柱子上的盘子从上到下都必须是依次增大。

        这里从全局角度看待这个问题,我们可以把A柱子上的盘子看做前n-1个盘子和第n个盘子,要将A柱子上的所有盘子都移到C上,一定是将前n-1个盘子移动到B柱子上,再将第n个盘子移到C柱子上。同理,我们将B柱子上的前n-2个盘子移到A柱子上,将第n-1个盘子移到C柱子上……递归可以完美的解决这个问题

def move(n, a, b, c):

if n>0:

    if n == 1: print ('请移动:', a, ‘—>’, c)          #设定如果n=1的情况,直接打印a—>c

    return

    move(n-1, a, c, b)                                        #如果n>1,就要把n-1个盘子移动到B上去(可以经过c)

    print (‘请移动:’, a, ‘—>’, c)                         #然后把剩下的n号盘从A移动到C

    move(n-1, b, a, c)                                        #最后把在B上的n-1个盘子都挪到C上去(可以经过a)

这个逻辑特别清楚,我觉得这就是数学之美,可以通过抽象的方法把复杂的问题简单化,而且还能解决问题,完美!

 

以下是我所参考文章的出处,作者写的很详细,同时感谢那些给我答疑解惑的人,尽管不认识,但是是你们的分享让我进步。
作者:大如
链接:https://zhuanlan.zhihu.com/p/35340802
来源:知乎
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值