【问题标题】:Recursive function for Fibonacci number斐波那契数的递归函数
【发布时间】:2020-03-21 23:10:24
【问题描述】:

我必须编写一个简单的程序,如下所示:“给定一个非负整数 n,使用递归找到第 n 个斐波那契数”。我认为这意味着,对于用户输入的任何值,我都必须得到斐波那契数。例如,如果用户输入 4,我将不得不获取斐波那契数列中的第 4 个值(即 2)。下面是我写的内容,但是我的递归有问题,因为它在我运行它时会崩溃。感谢任何帮助...

int userValue;
int fibo;
int fib(int n);
int fibValue;


int main() {
    cout << "Please provide your value" << endl;
    cin >> userValue;

    while (userValue < 0) {
        cout << "Fibonacci numbers only start at 0, please try again: " << endl;
        cin >> userValue;
    }

    if (userValue == 1 || userValue == 0) {
        cout << "Fibonacci result is: " << userValue << endl;
        return 0;
    }
    else {
        fib(userValue);
        cout << "Fibonacci result is: " << fibValue << endl;
        //return 0;
    }
}

int fib(int n)
{
    fibValue = fib(n - 1) + fib(n - 2);
    return fibValue;
}

【问题讨论】:

    标签: c++ c++11 recursion fibonacci


    【解决方案1】:

    上述代码中的递归永远不会停止,只有在堆栈已满时才会停止,从而导致程序运行时终止。 为你编程:

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

    【讨论】:

    • 第三个斐波那契数是多少,根据您的功能?因为根据它,第 1、第 2 和第 3 个数字似乎等于 1。这不是斐波那契数列:en.wikipedia.org/wiki/Fibonacci_number
    • 是的,对于n == 3,根据您的代码,斐波那契数将为 1。
    • 好吧,既然斐波那契可以从 0 开始,使它成为 0,1,1 是的,第三个数字是 1,但是对于第一个和第二个,他已经在调用递归之前进行了检查。
    【解决方案2】:

    问题出在fib方法上,没有提供终止条件。 因此,递归将在循环中发生而不会终止。

    首先,尝试通过提供多个输入来调试任何问题,您就会明白问题出在哪里。

    在你的情况下,

    假设n=3

    轨迹是这样的

    fib(3) -&gt; which further invokes fib(2) and fib(1)

    fib(2) -&gt; which further invokes fib(1) and fib(0)

    现在因为没有终止条件

    fib(0) will further invoke fib(-1) and fib(-2)

    因为负值的fib不存在,所以应该提供终止条件,以便递归停止并返回结果。

    对于斐波那契数,终止条件如下:

     if(n == 0){
      return 0;
     }else if (n == 1){
      return 1;
     }
    

    很少参考

    https://blog.hartleybrody.com/debugging-code-beginner/

    https://www.codementor.io/mattgoldspink/how-to-debug-code-efficiently-and-effectively-du107u9jh%60

    希望这会有所帮助。 谢谢。

    【讨论】:

    • 由于if(n == 0 || n==1){ return 0; } - 任何所说的函数都会返回,是0,因为无论您将0 添加到0 多少次,由于fib(n - 1) + fib(n - 2); - 它会永远不要大于0
    • if(n == 0 || n==1){ return 0; } 只是显示终止条件的示例。无论如何,我编辑了特定于斐波那契的答案!。谢谢。
    • 这可能是,但它仍然可能让提问者感到困惑。
    • 是的@AlgirdasPreidžius,我意识到了。感谢您的评论。
    【解决方案3】:

    你的递归停止条件在它之外,在下面的 if 中:

    if (userValue == 1 || userValue == 0) {...}
    

    但它应该在 fib 函数中。

    您目前拥有的是无限递归,它是堆栈溢出的最短路径。

    【讨论】:

    • userValue 不会随时改变,要改变的是N。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2021-11-17
    • 2014-11-09
    • 2011-07-27
    • 2020-12-18
    • 2021-02-13
    • 2012-02-14
    相关资源
    最近更新 更多