繁体   English   中英

递归函数中的分段错误

[英]Segmentation fault in recursive function

我最近第一次阅读有关记忆的信息(我是菜鸟),我想尝试制作一个使用记忆的斐波那契函数。 这是我尝试过的方法,但是超过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;
}

这个想法是fibonacci(n)的递归方法将首先计算fibonacci(0),fibonacci(1),fibonacci(2)直到fibonacci(n)。 这意味着它将按照n的自然顺序进行计算,而push_back将精确地遵循此顺序。

其他人则对您的向量缺少push_backs发表了评论。 我要补充一点,您的向量纯粹是在函数的一次调用中本地使用的-它没有在递归调用堆栈上下浮动的范围,因此它不会按预期运行。 相反,您需要将向量设置为static ,或者最好通过引用将其传递给每个递归调用。 更好的是将其设为班级。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM