递归函数中的分段错误

Segmentation fault in recursive function

本文关键字:错误 分段 递归函数      更新时间:2023-10-16

我最近第一次读到关于记忆的文章(我是一个noob),我想尝试制作一个使用记忆的fibonacci函数。这是我尝试过的,但任何超过1的东西都会给我带来分割错误。感谢您的帮助!

unsigned int fibonacci( unsigned int n )
{
    vector<unsigned int> fibvector;
    if ( n <= 1 )
        return n;
    if ( fibvector.size() >= n )
        return fibvector[n];
    unsigned int add = fibonacci( n-1 ) + fibonacci( n-2 );
    fibvector[n] = add;
    return add;
}
vector<unsigned int> fibvector; 

是一个局部变量。每次调用fibonacci(n)时,都会创建一个不包含元素的新向量。你可以通过使它静止来修复它。

static vector<unsigned int> fibvector(MAXELEMENTS); 

MAXELEMENTS用于初始化目的。在这种情况下,您需要使用进行测试

if(fibvector[n] != 0) return fibvector[n];

编辑:如果您不需要固定数量的元素,您可以使用以下

unsigned int fibonacci( unsigned int n )
{
    static vector<unsigned int> fibvector;
    unsigned int fib;
    if ( fibvector.size() > n )
        return fibvector[n];
    if(n <=1){
       fib = n;
    }
    else{
       unsigned int v2 = fibonacci( n-2 );
       unsigned int v1 = fibonacci( n-1 );
       fib = v2 + v1;
    }
    fibvector.push_back(fib);
    return fib;
}

其思想是,斐波那契(n)的递归方法将首先计算斐波纳契(0)、斐波那奇(1)、斐波那契(2),直到斐波纳奇(n)。这意味着它将按照n的自然顺序进行计算,push_back将准确地按照这个顺序进行计算。

其他人评论您的矢量缺少push_backs。我要补充的是,您的向量对于函数的一个调用来说是纯本地的——它在递归调用堆栈中没有上下作用域,所以它不会像您预期的那样工作。相反,您需要使向量static,或者更好地通过引用将其传递给每个递归调用。更好的办法是把它变成一门课。