对递归算法的理解

最近刷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;
}




posted on 2017-09-13 23:09  sichenzhao  阅读(182)  评论(0编辑  收藏  举报

导航