数据结构与算法学习--递归

今天简单了解一下递归,递归对我来说还是比较难理解的一种算法;关键因素是如何找到递推的公式。下面就简单的来了解一下满足递归的条件,及递归的弊端,递归的关键因素。
在这里插入图片描述
递归的弊端:
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)。

猜你喜欢

转载自blog.csdn.net/jsh13417/article/details/83119630