基础算法——递归

刷剑指offer,遇到一些经典算法,现总结下想法。

递归算法最经典的问题非汉诺塔问题了。如果我是教算法的老师,我会和大家讲一个故事。故事的主人公名叫愚公,对,就是愚公移山的那个愚公,话说愚公老年的时候突然有一天发神经,发誓要将门前的两座大山移走(年轻的时候咋不发誓做呢,浪去了吧)。他对智叟诉说道,我虽然年纪大了,一个人没办法移走这两座大山,但是我有子子孙孙,无穷尽也,他们可以把大山移走。然后他的事迹被报告到了天帝那,天帝被愚公的诚心感动,命令大力神夸娥氏的两个儿子背走了那两座山。。。扯呢,,还大力神俩儿子。。哼!其实就是愚公的子子孙孙一把土一把土把大山移走的,后人为了将故事传唱下去,故意润色而已(是我在扯是我在扯,?)。OK,回到主题。愚公移山可以强行曲解成一个递归问题。细想想,愚公这一代人做了什么?他们只是将大山移走了一部分土渣,相当于将问题规模缩小了1,(n-->n-1),他所要思考的问题只是如何将规模缩小1即(n-->n-1),剩下的n-1规模的大山都交给子子孙孙吧,子孙一定会完成遗愿的,哈哈哈。这就很像一个递归问题了。

我们结合到汉诺塔问题。先描述下汉诺塔问题:就是将a柱的铁圈移到c柱,移动过程中大的铁圈不能压小的铁圈(描述完了)。下图不是我的,用别人做好的,挺好的,侵删。嘻嘻。

愚公就是要将a上的铁圈山移动c上,这回是有附加要求的(大的不能压小的)。 愚公还是在想老问题,如何将规模缩小(n-->n-1)呢?这里具体的汉诺塔问题就是如何将规模64的铁圈变成规模63。之后,交给子孙处理,(记住,子孙只要处理规模63的铁圈就够了),毕竟一代人就要完成一代人的任务。咳咳,重点来了,64到63?减去1不就行了?哈哈哈,对!减去1个铁圈!那么减去哪个铁圈呢?最大的还是最小的?作为祖宗,愚公肯定要把最大铁圈处理掉啊。你问我why?那我要祭出递归的第一原则了从问题的头(顶端、终点、最后、)出发,意思就是:解决了这个问题,以后就不会涉及到这个问题了。汉诺塔问题的头就是那个最大的铁圈,最大的铁圈搞定了,以后就不用动它了。这是愚公这一代人要完成的事,即把最大铁圈从a移到c。可是最大圈上面还有63个小圈呢,唉唉唉~说好的63个规模交给子孙呢。这里就要祭出递归第二原则:考虑递归函数的能力。哦!忘了说了!递归函数就是就是f(n)啊,它能被设计成搬动两座大山,也能设计成搬运64个铁圈到c。愚公看见是64个铁圈,他儿子看到的将会是63个铁圈,because愚公搬走了一个。回到下划线处(上面还有63个小圈呢),愚公说:交给儿子吧!让儿子用递归函数f(63)把上面63个碍事的铁圈先搬到b柱上,这样我就可以一秒之内把最大的铁圈从a搬到c了。嘻嘻。然后再让儿子把刚搬到b上的铁圈再搬到c上来,这样!家族大业就完成啦!我们老愚家就又有一个事迹可以刘芳百世了!好好干!儿子和孙子们!OK。故事讲完了。我们补一个递归第三原则:边界处理。(哎。刚才为了故事连贯性,没有打断,现在补上哈)。边界处理就是何时终止的问题,早晚有一天,山会被挖平,再挖就变盆地了!!所以要告诉子孙何时终止,移山是平了就终止,汉诺塔是子孙把最小的一片铁圈放到c上就结束。

递归三原则:

(1)从顶端出发,缩小问题规模。

(2)设计递归函数的作用是什么。

(3)边界处理,何时终止。

 

 

to be continued...

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值