递归

递归的概念

程序调用自身的编程技巧称为递归( recursion)。——百度百科。

这是百度百科的解释,拿C语言来说,一个很常见的知识是,除了主函数,其他函数都可以调用自身或者出资身外的函数(除主函数)。就好比俄罗斯套娃,一层接着一层。而我个人对于递归的理解主要有两个方面,一个是递,一个是归。
递,就是层层深入,不断向里的过程。但是递总不能是无限的,计算机不能解决无限大的问题,所以这个递,总是要有个一个出口的,在程序中来说,就是某个条件,一旦达成了这个条件,递归中的第一过程便不再进行,从而转向第二过程的归。
归,就是回归、归纳的意思,既然递是层层深入的,那归便是从最深的一层层层向外,直到达到最外层,结束递归。

递归的实例

递归的一个经典的例子就是斐波那契数列的求解。

斐波那契数列的规律是前两项为1,从第三项开始,每一项都是他前面两项的和。举个例子,我们要求斐波那契数列的第四项,那我们首先要知道第二项和第三项,而要知道第三项,我们首先要将第一第二项进行相加。也就是下面这个过程。

第一第二项均为已知条件,f(1) = 1, f(2) = 1;
要求第四项,我们可以知道f(4) = f(2) + f(3), 因为f(2)是已知的,所以我们要求f(3)
f(3) = f(1) + f(2) = 2, 所以f(4) = f(2) + f(3) = 1 + 2 = 3

从上面这个过程,应该不难看出,这个递归的递归出口,应该是当要求的项为1或2的时候,因为一二项都是已知的。而在求其他项时,可以转化为f(n - 2) + f(n - 1)的结果,而这两项又分别可以向下进行分解,直到达到最后的两个递归出口,再向外层层退出。

代码实例

#include 

using namespace std;

int fibonacci(int n)
{
    int cnt = n;
    if (n == 1) //递归出口,返回1
        return 1;
    if (n == 2) //递归出口,返回1
        return 1;
    else //若不满足,则返回前两项的和
        return fibonacci(n - 2) + fibonacci(n - 1);
}

int main(int argc, const char *argv[])
{
    int n;
    cin >> n;
    cout << fibonacci(n) << endl;
    system("pause");
    return 0;
}

你可能感兴趣的:(递归)