对递归算法的理解

最近刷leetcode题时,碰到题目需要用到递归算法,否则基本无解。


接下来结合实例谈谈本人对递归算法的理解。


对递归算法的形象解释:想象用一本纯英文词典查单词,要查某一个单词的意思,翻到这个单词时,看解释,发现解释中有一个单词不认识,所以,无法明白这个要查的单词是什么意思;这时,再用这本词典(函数本身)查那个不认识的单词,又发现查的第2个单词的解释中又有一个单词不认识,那么,又再用这本词典查第3个不认识的单词,这样,一个一个查下去,直到解释中所有单词都认识,这样就到底了,就明白了最后一个单词是什么意思,然后一层一层倒回来,就知道我最初想查的第1个单词是什么意思了,问题就解决了。


先给出了一个实例:

题目:猴子摘了好多好多桃子,一天需要吃掉总数的1/3,觉得不过瘾,还得再多吃一个吃到第9天的时候,发现只有2个桃子了。问,当初猴子摘了多少桃子?


这道题看上去就是个循环,如果一层一层去分析的话,非常复杂,并且如果天数更多的话,更难做下去。这种问题适用于递归算法。


递归算法如何思考:1.找到重复的最小单元。2.找到前一次和后一次的函数关系,这个函数关系也就是最小单元中应该实现的。只要找到前后关系,那么就可以利用函数中调用函数来实现。


假设今天还没吃之前的桃子总数为s1,那么今天应该吃掉1/3×s1+1,那么今天剩下的,也就是明天还没吃之前的桃子总数s2=s1-(1/3×s1+1)


因此函数关系找到了: s1=1.5*(s2+1)。这就是前一天与今天的数量函数关系。f(1)=1.5*(f(2)+1)

当天数为9时,s=2,因此可以写代码了:


int sum(int day) {
  int sums;
  if (day ==9)
    return 2;

   sums = 1.5*(sum(day+1)+1);
   return sums;
}




转载于:https://www.cnblogs.com/sichenzhao/p/9320234.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值