今天简单了解一下递归,递归对我来说还是比较难理解的一种算法;关键因素是如何找到递推的公式。下面就简单的来了解一下满足递归的条件,及递归的弊端,递归的关键因素。
递归的弊端:
1、堆栈溢出问题
函数调用都会讲临时数据变量进行压栈处理,等函数调用结束才出栈;如果递归调用深度太大,就会导致栈溢出。
linux系统栈的大小一般是1K大小,可以在代码中增加判断,调用深度大于1K时,直接返回。只是简单的避免栈溢出的方式,但因为栈可能被其他线程占用,也存在判断不满足要求时。
2、重复计算问题
斐波那契数列,可以采用Memoization技术,以避免递归重复计算;
int fib ( n )
{
if ( n == 0 || n == 1 ) {
return 1;
}
else {
return fib( n - 2 ) + fib ( n - 1 );
}
}
优化完如下:
int calc_fib ( int n )
{
int val[ n ] , i;
for ( i = 0; i <=n; i++ ) {
val[ i ] = -1; // Value of the first n + 1 terms of the fibonacci terms set to -1
}
val[ 0 ] = 1; // Value of fib ( 0 ) is set to 1
val[ 1 ] = 1; // Value of fib ( 1 ) is set to 1
return fib( n , val );
}
int fib( int n , int* value )
{
if ( value[ n ] != -1 ) {
return value[ n ]; // Using memoization
}
else {
value[ n ] = fib( n - 2 , value ) + fib ( n - 1 , value ); // Computing the fibonacci term
}
return value[ n ]; // Returning the value
}
3、函数调用耗时大
4、空间复杂度O(N)。