C++ 递归

递归是计算机编程中应用最广泛的一个技巧,也是比较难理解的一个技巧。所谓递归,就是函数调用函数自身,一个过程或者函数在其定义或说明中有直接或者间接调用自身都叫递归。而递归一般都用来解决有重复子问题的问题。

我们先来理解直接递归,间接递归非常复杂,用的比较少。下面通过求解 n! 的问题来理解直接递归。

int factorial(int n) {
    return n * factorial(n - 1);
}

我们定义 int factorial( int n )函数的功能是返回 n!。如果你在心里模拟一遍 factorial(1) 的运行过程,你会发现函数好像会无限地调用下去。这样引申出递归的一个难点——边界条件。所谓边界条件,就是什么情况下,函数不应该再继续调用自身了。那么很显然,按照阶乘的定义 factorial 函数对应的边界条件是 n==1,如果 n==1,函数应该立即返回 1。

int factorial(int n) {
    if (n == 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

为了更通俗易懂地理解,看下面代码。

int factorial_1() {
    return 1;
}
int factorial_2() {
    return 2 * factorial_1();
}
int factorial_3() {
    return 3 * factorial_2();
}

调用 factorial(3) 和 factorial_3() 会得到同样的结果。你会发现,factorial(3) 递归的过程和 factorial_3() 调用的过程是一模一样,只是factorial(3) 调用的是自己,这也就是所谓的递归。factorial_2() 相当于调用 factorial(2) 。如果你调用的 n 更大,你会发现,写出的 factorial_n() 都具有一样的形式,所以我们能只写一个函数,然后自己调用自己,实现递归。

再来看一个比较复杂的问题。
Fibonacci 数列的定义是:
这里写图片描述
如果用递归写 Fibonacci 数列,按照定义:

int fib(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    return fib(n - 1) + fib(n - 2);
}

你可能感兴趣的:(C++数据结构)