定义
直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。使用递归技术往往会使代码更简洁,使算法的描述更清晰且容易理解。
举例
例 1:阶乘函数
阶乘函数递归的定义为:
当n=0时,n!=1,这是这个函数的初始条件,是非递归定义的,是此递归函数的退出条件。这个递归函数在执行时,会不断的调用自身,寻找自身的值减一后的阶乘值,直到自身值减一为0时,此时函数递归到了最后一层(即非递归定义的退出条件),这时n=0的阶乘为1,然后层层回滚,计算出n=1的阶乘的值后,再去计算n=2时阶乘的值,这样一直不断的计算n+1阶乘的值,直到回滚到初始的n的阶乘的值。
每一个递归函数都要有非递归定义的初始值,不然无法退出函数调用的循环。
代码如下:
#include<iostream> using namespace std; int sum = 0; //定义全局变量sum,用于记录函数调用自身的次数 //使用 long long 类型的返回值,防止n的阶乘的值过大,超出了int型的范围 long long fac(int n) { sum++; if (n == 0 ) return 1; else return n * fac(n - 1); } int main() { int n; cin >> n; cout << n << "的阶乘为:" << fac(n) << endl; cout << "函数调用的次数为:" << sum; return 0; }
运行结果:
结果分析:
最开始传值的时候即n=8时进入函数,sum自增后为1。此后,进入else分支,进行递归,再次进入函数时n=7。依此类推,最后一次进入函数时n=0,而n=0恰好是此递归函数的初始条件,自此不再调用自身。故此可以看出初始条件是递归函数所必需的要有的,不然无法退出循环。当n=8,7,6,5,4,3,2,1,0时都进入过函数,故sum累加值为9。
例 2:斐波那契数列
无穷数列 1, 1, 2, 3, 5 ,…称为斐波那契数列,它具有前两项之和等于后一项的特点。它可以递归的定义为:
代码如下:
#include<iostream> using namespace std; int sum = 0; //记录函数调用的次数 int Fibonacci(int n) { sum++; if(n == 0) return 1; if(n == 1) return 1; if(n > 1) return Fibonacci(n - 1) + Fibonacci(n - 2); } int main() { int n; cin >> n; cout << "斐波那契数列的第" << n <<"项为:" << Fibonacci(n) <<endl; cout << "函数调用的次数为:" << sum; return 0; }
运行结果:
结果分析:
n=3时进入函数一次(sum=1),执行递归项为Fibonacci(1)和Fibonacci(2)。执行Fibonacci(1)时(sum=2),直接返回结果1,不再递归。而执行Fibonacci(2)时(此时sum=3),执行递归项Fibonacci(1)和Fibonacci(0),执行完后sum=3+2=5。故共调用函数5次。