【问题标题】:What is wrong with my recursive fibonacci program?我的递归斐波那契程序有什么问题?
【发布时间】:2012-03-02 04:42:00
【问题描述】:

我不确定我的逻辑有什么问题。示例输出:

How many terms of the Fibonacci Sequence do you wish to compute?
1
1
1
--How many terms of the Fibonacci Sequence do you wish to compute?
5
5
5
5
5
5
5

为什么要这样做?

    // Recursive Fibonacci Sequence
#include <iostream>
using namespace std;

double fib(double number);

int main(void) {
        double number;
        cout << "How many terms of the Fibonacci Sequence do you wish to compute?" << endl;
        cin >> number;

        for(int i = 0; i <= number; ++i)
                cout << fib(number) << endl;
} // end main

// function fib definition
double fib(double number) {
        if((number == 0) || (number == 1))
                return number;
        else
                return fib(number - 1) + fib(number - 2);
} // end function fib

【问题讨论】:

    标签: c++ recursion fibonacci


    【解决方案1】:

    看看你的循环:

    for(int i = 0; i <= number; ++i)
        cout << fib(number) << endl;
    

    注意循环体如何不使用i...它总是调用fib(number)。将其更改为 fib(i) 将修复它。

    (这不是非常有效,因为您最终每次都会重新计算值,但这是另一回事。虽然您可以将打印放在fib 中,但这会混淆“如何处理结果”和“计算斐波那契数列”。)

    【讨论】:

    • “效率不高”——这是斐波那契数列的简单 O(2^n) 解决方案。但是 +1。
    • @larsmans:比这更糟糕,因为它被称为n 次。即使 fib 函数更改为简单的 O(n) 迭代方法,它仍然是 O(n^2) 不必要的 - 有办法解决这个问题,但我认为这超出了问题的范围。
    【解决方案2】:

    你应该只在你的 for 循环中传递 'i' 作为参数而不是 'number'

    【讨论】:

      【解决方案3】:

      制作:

      for(int i = 0; i <= number; ++i)
          cout << fib(i) << endl;
      

      【讨论】:

      • 另外请注意,您不应该使用双数进行直接比较。在这种情况下,斐波那契数始终只是一个整数...
      • 在这种情况下,比较没有问题。他比较的数字以精确的整数值开始,并且是递减的,因此应该保持精确的整数值。
      • @Unni:它总是一个整数,但能够更好地处理超过 42 亿的数字
      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      相关资源
      最近更新 更多