递归定义:
递归就是函数直接或间接调用自身。递归函数设计时明确三点,一是明确递归边界条件、二是继续执行递归,三是递归返回。当不满足递归边界条件时,递归前进,也即继续执行递归。当满足边界条件时,递归返回。
递归常用于解决一下三个问题:
1、数据格式就是递归形式,如Fibonacci函数等
2、数据结构以递归定义,如二叉树,图等
3、问题解法是以递归实现,如回溯
普通递归缺点:
普通递归在每次递归调用返回之前,都不会得到计算结果,普通递归解法相比与循环等,运行效率更低。并且每一次调用时,程序都会为这一次调用开辟栈空间存储一些数据,当递归过大,容易栈溢出。
下面为实现Fibonacci函数的普通递归。
int Fibonacci(int n){
if(n<=2) return 1;
return Fibonacci(n-1)+Fibonacci(n-1);
}
程序结构十分简单,若求n=5的值,
Fibonacci(5) = Fibonacci(4)+Fibonacci(3) =5
Fibonacci(4) = Fibonacci(3)+Fibonacci(2) = 3
Fibonacci(3) = Fibonacci(2)+Fibonacci(1) = 2
Fibonacci(2) = 1
Fibonacci(1) = 1
程序的递归是从上往下递归,而计算结果并返回是从下往上返回。
尾递归:
尾递归是指一个函数里的最后一个动作是返回一个函数的调用结果的情形,即最后一步新调用的返回值直接被当前函数的返回结果。如:
int f(int x){
f1();
f2();
return g(x);//直接调用函数g(x)
}
其核心理解在于,当调用其他函数时,自身是否能被释放。
尾递归实现Fibonacci:
int Fibonacci(int n ,int ret1,int ret2){
if(n<=2){
return 1;
}
return Fibonacci(n-1,ret2,ret1+ret2)
}
其实现是本次计算结果,传递到下一次函数中执行计算。