递归斐波那契

blc*_*llo 35 c++ recursion fibonacci

我很难理解为什么

#include <iostream>

using namespace std;

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

int main() {
    cout << fib(5) << endl;
}
Run Code Online (Sandbox Code Playgroud)

导致分段错误.一旦x下降到1不应该最终返回?

Geo*_*che 150

x==2你调用fib(1)fib(0):

return fib(2-1)+fib(2-2);
Run Code Online (Sandbox Code Playgroud)

考虑fib(0)评估时会发生什么......

  • +1不直接给出答案,但指出问题所在.对于正在学习的人来说好多了. (73认同)
  • +1,我和我最大的孩子(9)使用相同的技术,这刺激了他解决问题的能力. (4认同)

Lir*_*una 40

原因是因为Fibonacci序列以两个已知实体0和1 开始.您的代码只检查其中一个(是一个).

将您的代码更改为

int fib(int x) {
    if (x == 0)
        return 0;

    if (x == 1)
        return 1;

    return fib(x-1)+fib(x-2);
}
Run Code Online (Sandbox Code Playgroud)

包含0和1.

  • 或者将两行更改为"if(x <= 1)返回x`.:-) (6认同)
  • 这个系列不是从1,1开始的吗? (3认同)
  • @Aviator:取决于你如何定义斐波纳契数.;) (2认同)

Dzm*_*uba 11

为什么不使用迭代算法?

int fib(int n)
{
    int a = 1, b = 1;
    for (int i = 3; i <= n; i++) {
        int c = a + b;
        a = b;
        b = c;
    }           
    return b;
}
Run Code Online (Sandbox Code Playgroud)

  • 元编程方法基本上归结为递归解决方案......计算将简单地从运行时转移到编译时.声称这是一种更好的方法是没有意义的,因为我们不知道OP要求:如果他只需要运行一次程序,拥有大量的编译时间和短的运行时间并不比编译时间短并且运行时间很长.类似地,如果他需要将'n'参数作为输入,则元编程不可用(除非您明确地将上限设置为此数字).而且,编译器有限...... (13认同)
  • ...递归深度,所以这可能是一个问题.总而言之,元编程是一个非常强大的工具,但只有当它真正适合问题时才应该明智地使用. (6认同)
  • 这是最好的方法.但他要求一个递归的解决方案. (3认同)

Van*_*nji 7

根据定义,Fibonacci序列中的前两个数字是1和1,或0和1.因此,您应该处理它.

#include <iostream>
using namespace std;

int Fibonacci(int);

int main(void) {
    int number;

    cout << "Please enter a positive integer: ";
    cin >> number;
    if (number < 0)
        cout << "That is not a positive integer.\n";
    else
        cout << number << " Fibonacci is: " << Fibonacci(number) << endl;
}

int Fibonacci(int x) 
{
    if (x < 2){
     return x;
    }     
    return (Fibonacci (x - 1) + Fibonacci (x - 2));
}
Run Code Online (Sandbox Code Playgroud)