c ++ segfaulting中的Fibonacci扩展

时间:2010-09-08 09:16:23

标签: c++ segmentation-fault fibonacci

我正在尝试将扩展添加到Fibonacci数字以考虑负指数。 扩展名为Fib(-n)=( - n)^(n + 1)* Fib(n) 我试图用c ++实现这个,但我遇到了一个问题,我不知道如何绕过它。

#include <iostream>
#include <math.h>


int fib(int n) {
    if ( n < 0 ){ 
        return ( pow(-1,-n+1 ) * fib(-n) );
    }else if (n == 0){
        return 1;
    }else{
        return fib(n-1) + fib(n-2);
    }
}


int main(void){
    std::cout << "fib("<< -2<<") = " << fib(-2) << std::endl;
    return 0;
}

这给了我一个段错误,知道为什么会这样吗?

编辑: 我弄清楚问题是什么。忘了一个基本情况,这导致了一个无限递归,这反过来导致了一个段错误。

4 个答案:

答案 0 :(得分:4)

我想当你拨打fib(-2)时,它会调用fib(2)

fib(2)来电fib(1)fib(0)

fib(1)来电fib(0)fib(-1)

fib(-1)调用fib(1),这是永无止境的循环

答案 1 :(得分:1)

这将导致无限递归。您需要两个终止案例,而不是一个。

fib(1)为例。这会调用fib(0)fib(-1)fib(0)将终止,但fib(-1)将无限地调用fib(1), which will then again call fib(-1)`。

解决方案:如果n==0n==1

,则终止递归

旁注:fib(0)通常定义为0,而不是1。

答案 2 :(得分:1)

糟糕,我犯了一个愚蠢的错误,忘记了n == -1基本情况。它应该是:

int fib(int n) {
    if( n == -1){
        return 1;
    }else if ( n < 0 ){ 
        return ( pow(-1,-n+1 ) * fib(-n) );
    }else if (n == 0){
        return 1;
    }else{
        return fib(n-1) + fib(n-2);
    }
}

现在一切都按预期工作了。

答案 3 :(得分:1)

According to your extension, shouldn't this be:
int fib(int n) { 
    if ( n < 0 ){  
        return ( pow(-1,n+1 ) * fib(n) ); // <<<
    }else if (n == 0){ 
        return 1; 
    }else{ 
        return fib(n-1) + fib(n-2); 
    } 
}