递归

1. 在递归的实现中,往往需要假设后续的调用已经完成,在此 
基础之上,才实现递归的逻辑。 递归操作的每两步都是有紧密的联系,如在“递归”的“归操作时”,前一次的输出就是后一次的输入。
2. 分析清楚递归体的逻辑,然后写出来。

3. 考虑清楚递归退出的边界条件。也就说,哪些地方应该写return。 
注意到以上 3 点,在面对递归问题的时候,我们将总是有章可循。

1、递归的概念

递归的定义:在定义一个过程或函数时出现调用本过程或本函数的成分称之为递归。如果是自身调用自身,称之为直接递归。如果是通过调用中间函数,有中间函数调用自身,则称之为间接递归。如果一个递归过程或递归函数中递归调用语句是最后一条语句则称这种递归式尾递归。

何时使用递归:

1.问题的定义是递归的。比如求阶乘,fibonacci数列等

2.数据结构是递归的,比如我们在写树相关的算法和链表算法时

3.问题的求解方法是递归的。比如折半查找。

2、递归模型

递归模型是递归算法的抽象,它反映一个递归问题的递归结构,拿求某个整数的阶乘举例:
fun(1)=1; fun(n)=n*fun(n-1);
这两个式子给出了这个问题的递归定义,第一个式子给出了递归的边界条件,第二个式子给出了fun(n)和fun(n-1)的值之间的关系,我们把第一个式子称之为递归的出口,第二个式子称之为递归体。一般而言递归模型是由递归出口和递归体两部分组成,前者确定递归到何时结束,后者确定递归求解的递推关系。实际上递归的思路是把一个不能或者不好直接求解的“大问题”转化为一个或者几个“小问题”来解决。再把“小问题”进一步分解为更小的“小问题”来解决,如此分解,知道“小问题”可以直接求解。在这里,我们应该注意到,递归模型的分解要能进行,必须满足两个条件,“大问题”和“小问题”是相似的也就是说他们的解决方法是相同的,他们满足固定的递推关系,还有就是再分解到某一个小问题时,小问题可以直接求解。这个小问题就是我们前面提到的递归出口,此时,分解结束,开始求值。分解是量变的过程 ,大问题慢慢变小,但是尚未解决,遇到递归出口之后,发生质变,即递归问题转化为直接问题。因此,递归算法的执行总是分为分解和求值两个前后部分。
3.递归算法设计
递归求解的过程均有这样的特征:
先将整个问题划分为若干个子问题,通过分别求解子问题,最后获得整个问题的解,而这些子问题和原问题的求解方法是相同的,因此可以把他们继续分解,直到子问题可以直接求解。这种自上而下的将问题分解、求解,再自下而上的引用合并,最后求出原有问题的解,这是一种分而治之的算法设计方法。
总结下:在做递归相关的题目时,脑海中要有这几个关键字---边界条件,递推关系,相似性, 分而治之,由上而下,这是对递归的简单描述。
原文地址:https://www.cnblogs.com/naliang/p/fibonacci.html