对递归的深刻理解

转载大佬的一篇文章:
递归
递归当然只能以递归的思路理解,把它展开纯属自讨苦吃。递归思路,说白了是如下三步:1、对于问题N,如果N-1已经解决了,那么N是否很容易解决。甲:想上天?你先给我找个天一样高的梯子!乙:想要天一样高的梯子?你先给我弄棵天一样高的树!甲:想要天一样高的树?你先给我弄把能顶到天的锯子!……举例来说,如果要把一个N层汉诺塔从A搬到C,那么:如果前N-1层可以找别人搞定,咱只管搬第N层,会不会变得非常容易?你看,这一下就简单了:这时当它只有两层就好了,先把前N-1层看作一个整体,把它搬到B;然后把最下面的第N层搬到C;然后再把前N-1层从B搬到C。类似的,假如接到“搬前N-1层”这个任务的是我们,怎么搬呢?简单,像前东家一样,把前N-2层外包出去,我们只搬第N-1层——其实和前面讨论过的“外包N-1层,只搬第N层”完全一样嘛。依此类推,一层层“外包”下去——我不管你们有多伤脑筋,反正只要你们把我外包给你的活干了,我就能干了我的活!注意,这里千万别管“接到外包工作的家伙有多伤脑筋”——丢给他就让他头疼去,我们就别再捡回来痛苦自己了。这一步就是“递推”。注意这里的搬法:搬第N层,就需要把前N-1层搬两次,另外再把第N层搬一次;搬第N-1层,又需要把前N-2层搬两次,然后再把N-1层搬一次,依此类推。很容易知道,一共需要搬2N-1次。2、一步步递推下去,终究会有个“包工头”,接到“搬第一层”的任务。第一层怎么搬?太简单了,让搬哪搬哪。换句话说,到此,“递推”就到了极限,简单粗暴直接做就可以了。3、既然第一层搬了,那么第二层当然就可以搬了;第二层搬了,第三层又可以搬了……依次类推,直到第N层。于是问题搞定。这一步就是“回归”。如上三步加起来,就是“递归”。推而广之,任何问题,不管规模为N时有多复杂,只要把N-1那块“外包”给别人做之后,我们在这个基础上可以轻易完成N,那么它很可能就适合用“递归”解决。那么,怎么最终确定它能不能用“递归”做呢?看当N取1或2之类最简情况时,问题是否可以解决——然后写程序解决它。容易看出,“递归”其实和“数学归纳法”的思路非常像:证明N=1时成立;证明若N=n-1成立,则N=n时也成立;如上两步得证,则命题在n>1时一定成立(n为自然数)。你看,我们没必要从1开始逐一验证每个自然数,只要证明了“基础条件”、再证明了“递推条件”,大自然的规律会帮我们搞定一切。换句话说,只要我们:1、写程序告诉电脑“如何分解一个问题”2、写程序告诉电脑“当该问题分解到最简时如何处理”那么,“具体如何递推、如何回归”这个简单问题就不要再操心了,电脑自己能搞定。——写出问题分解方法、写出分解到最简后如何解决,这是我们的任务;把问题搞定,是电脑的任务。这就是递归的魅力。正是由于这种“我提供思路你搞定细节”的特点,“一切皆递归”的函数系语言才被称为“声明式编程”(而不是必须一步一步指导电脑如何做的“命令式编程”)。这么简单轻松的事,非要自己吭哧吭哧一步步做出来——O(2N)规模啊——难怪你们要陷入困境。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值