【问题标题】:I want to generate fibonacci series. Here is my code it is not generating the required fibonacci series我想生成斐波那契数列。这是我的代码,它没有生成所需的斐波那契数列
【发布时间】:2021-05-11 22:13:56
【问题描述】:
#include <iostream>
using namespace std;
int fib(int x)
{
    int number1 = 0;
    int number2 = 1;
    int next = 0;
    for (int i = 0 ; i < x-1 ; ++i)
    {
        next = number1 + number2;
        number2 = next;
    }
    return next;
}
int main()
{
    int n = 40;
    cout << fib(n);
    return 0;
}

请告诉我我做错了什么。它没有生成我想要的系列。我想从给定的数字生成斐波那契数列。

【问题讨论】:

  • number2 = next;之前尝试number1 = number2;
  • 您可能希望收集您在std::vector&lt;int&gt; 中计算的FIBO 值,并从fib() 函数中返回该值。在调用fib() 之后的步骤中,您插入一个循环以打印所有结果。
  • 获得答案的最简单方法是调试您的程序。如果你不知道怎么做,那么至少检查你的函数的返回值是否有一些小值。此外,您可以在for 循环中插入std::cout &lt;&lt; ... 以查看它是如何工作的。提示:number1 在你的循环中何时被更改?

标签: c++ loops for-loop fibonacci function-definition


【解决方案1】:

通过自己执行来调试您的代码:

int number1 = 0;
int number2 = 1;
int next = 0;

然后进入循环:

next = number1 + number2 = 0 + 1 = 1;
number2 = next = 1;

所以,你有

next = 1
number1 = 0
number2 = 1

下一次迭代:

next = number1 + number2 = 0 + 1 = 1;
number2 = next = 1;

你还有

next = 1
number1 = 0
number2 = 1

这将在整个循环中重复。
请注意,number1 的值为零并且永远不会改变,因此加法将始终给出number2 的值。

在每次循环迭代结束时,number2 应该保存到目前为止的总和,number1 应该有之前的值 number2(即之前的“迄今为止的总和”)。
你错过了最后一个关键步骤:

next = number1 + number2;
number1 = number2;
number2 = next;

【讨论】:

    【解决方案2】:

    在这个for循环中

    for (int i = 0 ; i < x-1 ; ++i)
    {
        next = number1 + number2;
        number2 = next;
    }
    

    您忘记为变量number1 设置新值。所以变量number1总是等于0

    同样,将函数参数声明为有符号整数类型int 也没有多大意义。您应该使用无符号整数类型。并且希望使用可以存储更大范围值的无符号整数类型作为返回类型。

    该函数可以通过以下方式声明和定义,如下面的演示程序所示。

    #include <iostream>
    #include <functional>
    
    unsigned long long fib( unsigned int n )
    {
        unsigned long long int first = 0;
        unsigned long long int second = 1;
        
        for ( unsigned int i = 0; i < n; i++ )
        {
            second += std::exchange( first, second );
        }
        
        return first;
    }
    
    int main() 
    {
        for ( unsigned int i = 0; i < 41; i++ )
        {
            std::cout << fib( i ) << ' ';
        }
        
        std::cout << '\n';
        
        return 0;
    }
    

    程序输出是

    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 
    

    【讨论】:

      【解决方案3】:

      所以第一件事是,你的函数只返回一个值,考虑使用 void 函数(使用 cout

      与这部分相关的功能也有问题

      next = number1 + number2;
      number2 = next;
      

      让我们看看,number1 总是'0',number2 总是'1',因为:

      下一个 = 0 + 1;始终为“1” 数字2 = 1;总是下一个,这意味着它总是'1'

      你必须把它改成这个

      !斐波那契数列以 '0' 开始!

      #include <iostream>
      using namespace std;
      void fib(int x) {
          int number1 = 0, number2 = 1, next = 0;
          for (int i = 0; i < x; i++) {
              cout << number1 << " ";
              next = number1 + number2;
              number1 = number2;
              number2 = next;
          }
      }
      
      int main() 
      {
          int n = 40;
          fib(n);
          return 0;
      }
      

      让我们看看现在会发生什么:

      cout << number1 << " "; // (0, 1, 2, 3, 5, 8, ...)
      next = number1 + number2; // (next = {0 + 1, 1 + 1, 1 + 2, 2 + 3, ...}) 
      number1 = number2; // (number1 = {1, 1, 2, 3, ...})
      number2 = next; // (number2 = {1, 2, 3, 5, ...})
      

      就是这样.. :)

      ps。考虑一下递归版本,我认为它比迭代版本容易得多。

      【讨论】:

        猜你喜欢
        • 2011-12-18
        • 2015-04-25
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        相关资源
        最近更新 更多