【问题标题】:Problem with fibonacci function. C++斐波那契函数的问题。 C++
【发布时间】:2011-05-19 23:34:11
【问题描述】:

应该返回数组的n 位置。但我得到的不是价值,而是 0。

int fibonacci(int n)
{
    int f[100];
    f[0] = 0;
    f[1] = 1;

    for (int i=2; i<n; i++)
    {
        f[i] = f[i-2] + f[i-1];
    }

    return f[n];
}

int main()
{
    cout << fibonacci(3);
    return 0;
}

新代码:

新问题它返回一个数字,然后它应该。例如,如果 'n==7' 则返回 '13' 而不是应有的 '8'。

int fibonacci(int n)
{
    int f[100] = { 0, 1 };

    for (int i=2; i<=n; i++)
    {
        f[i] = f[i-2] + f[i-1];
    }

    return f[n-1];
}

int main()
{
    cout << fibonacci(7);
    return 0;
}

【问题讨论】:

  • 您可以将数组初始化缩短为int f[100] = { 0, 1 },它会自动将所有其他元素初始化为0。此外,您可以将数组设为静态(并添加最后计算位置的静态计数器),这样您就不必每次都重新计算您已经知道的值。仅供参考
  • @Chris 谢谢,这很有帮助,我会确保并做到这一点。
  • 注意:fibonacci(48) 的代码中存在整数溢出。使用uint64_t 而不是int 来获得直到n==94 的正确值。 codepad.org/ApUew5IY
  • 如果您的测量结果表明程序在fibonacci() 函数codepad.org/Ve7pvSjP 中花费了太多时间,您可以将结果缓存在f 数组中

标签: c++ function fibonacci


【解决方案1】:

您忘记初始化数组的第 n 个值。您返回 f[n] 但最多只能初始化 n-1。

【讨论】:

    【解决方案2】:

    您的循环终止条件错误。由于这是家庭作业,也许您可​​以找出原因。

    【讨论】:

      【解决方案3】:

      问题在于您测试了i &lt; n(在您的示例调用中为n == 3),但您返回的f[3] 尚未设置为任何值。你很幸运,你得到的是零而不是随机的垃圾。

      将“&lt;”更改为“&lt;=”。


      工作代码 #1

      保留完整大小的数组。

      #include <iostream>
      using namespace std;
      
      static int fibonacci(int n)
      {
          int f[100] = { 0, 1 };
      
          if (n < 0 || n > 100)
              return -1;
          else if (n < 2)
              return f[n];
      
          for (int i = 2; i <= n; i++)
          {
              f[i] = f[i-2] + f[i-1];
              //cout << "f[" << i << "] = " << f[i] << endl;
          }
      
          return f[n];
      }
      
      int main()
      {
          for (int i = 0; i < 8; i++)
              cout << "fib(" << i << ") = " << fibonacci(i) << endl;
          return 0;
      }
      

      样本输出#1

      fib(0) = 0
      fib(1) = 1
      fib(2) = 1
      fib(3) = 2
      fib(4) = 3
      fib(5) = 5
      fib(6) = 8
      fib(7) = 13
      

      工作代码#2

      这使用了一个大小为 3 的数组,代价是大量的模运算:

      #include <iostream>
      using namespace std;
      
      static int fibonacci(int n)
      {
          int f[3] = { 0, 1, 0 };
      
          if (n < 0 || n > 100)
              return -1;
          else if (n < 2)
              return f[n];
      
          for (int i = 2; i <= n; i++)
          {
              f[i%3] = f[(i-2)%3] + f[(i-1)%3];
              //cout << "f[" << i << "] = " << f[i%3] << endl;
          }
      
          return f[n%3];
      }
      
      int main()
      {
          for (int i = 0; i < 8; i++)
              cout << "fib(" << i << ") = " << fibonacci(i) << endl;
          return 0;
      }
      

      它产生相同的输出 - 所以重复它没有意义。

      工作代码#3

      避免数组和模运算:

      #include <iostream>
      using namespace std;
      
      static int fibonacci(int n)
      {
          int f0 = 0;
          int f1 = 1;
      
          if (n < 0 || n > 46)
              return -1;
          else if (n == 0)
              return f0;
          else if (n == 1)
              return f1;
      
          int fn;
          for (int i = 2; i <= n; i++)
          {
              int fn = f0 + f1;
              f0 = f1;
              f1 = fn;
              //cout << "f[" << i << "] = " << fn << endl;
          }
      
          return f1;
      }
      
      int main()
      {
          for (int i = -2; i < 50; i++)
              cout << "fib(" << i << ") = " << fibonacci(i) << endl;
          return 0;
      }
      

      根据经验确定 32 位有符号整数的限制是正确的。

      示例输出 #3

      fib(-2) = -1
      fib(-1) = -1
      fib(0) = 0
      fib(1) = 1
      fib(2) = 1
      fib(3) = 2
      fib(4) = 3
      fib(5) = 5
      fib(6) = 8
      fib(7) = 13
      fib(8) = 21
      fib(9) = 34
      fib(10) = 55
      fib(11) = 89
      fib(12) = 144
      fib(13) = 233
      fib(14) = 377
      fib(15) = 610
      fib(16) = 987
      fib(17) = 1597
      fib(18) = 2584
      fib(19) = 4181
      fib(20) = 6765
      fib(21) = 10946
      fib(22) = 17711
      fib(23) = 28657
      fib(24) = 46368
      fib(25) = 75025
      fib(26) = 121393
      fib(27) = 196418
      fib(28) = 317811
      fib(29) = 514229
      fib(30) = 832040
      fib(31) = 1346269
      fib(32) = 2178309
      fib(33) = 3524578
      fib(34) = 5702887
      fib(35) = 9227465
      fib(36) = 14930352
      fib(37) = 24157817
      fib(38) = 39088169
      fib(39) = 63245986
      fib(40) = 102334155
      fib(41) = 165580141
      fib(42) = 267914296
      fib(43) = 433494437
      fib(44) = 701408733
      fib(45) = 1134903170
      fib(46) = 1836311903
      fib(47) = -1
      fib(48) = -1
      fib(49) = -1
      

      【讨论】:

      • 新问题它返回一个数字,然后它应该。例如,如果 'n==7' 则返回 '13' 而不是应有的 '8'。
      • 但是对于 case n=0 呢?
      • @Alec:我认为当您指定 F(0) = 0 和 F(1) = 1 时,F(7) = 13;请参阅上面的示例输出。
      【解决方案4】:

      好吧,你永远不会设置f[n],你只会上升到i &lt; n,即i == n-1。 尝试返回f[n-1]

      编辑:正如 Chris Lutz 指出的那样,我的回答不好,因为如果你打电话给 fibonacci(0),它会给出无效的结果

      就像许多人已经回答的那样,最好的解决方案是循环直到i &lt;= n
      当然,除非您希望 fibonacci(3) 返回斐波那契数列中的第 3 个元素而不是第 4 个元素,在这种情况下,fibonacci(0) 没有任何意义,正确的返回值将是 f[n-1]... n==0 的情况仍应以某种方式处理,n&lt;0n&gt;100 的情况也应如此。

      只要检查正确的边界,您就可以返回f[n-1]

      int fibonacci(int n)
      {
          int f[100] = { 0, 1 };
      
          if ((n <= 0) || (n > 100))
              return -1;//return some invalid number to tell the caller that he used bad input
      
          for (int i=2; i < n; i++) // you can use i < n here
          {
              f[i] = f[i-2] + f[i-1];
          }
      
          return f[n-1];
      }
      

      【讨论】:

      • -1 正确的问题,错误的解决方案。 fibonacci(0) 应该返回一个有效值。
      • @filipe - 如果你 @me SO 会通知我,以便我可以在投票更改时间限制到期之前撤回我的反对票。 (我只是在您编辑后一分钟碰巧检查了,所以这次你很幸运。)
      • @filipe 这是我所做的我
      • @Chris Lutz 喜欢这样吗?呵呵,我不知道。从现在开始我会使用它,谢谢。 =)
      • @filipe 事情是 n==0 是正确的输入,因为 f[n] 当 n=0 时是 f[0] ,如果这产生了任何场景,则 = 到 0。跨度>
      【解决方案5】:

      调用fibonacci(3),你的for循环(在斐波那契函数内)一直到i &lt; 3...

      表示最后一个赋值是f[2]。不像预期的那样f[3](这是您返回的值)。

      【讨论】:

        【解决方案6】:

        你不是说 返回 f[n-1];

        我猜你的编译器已经将数组 f[100] 设置为 0?

        看起来其他人的答案是正确的......

        【讨论】:

          【解决方案7】:

          n 是您的版本中从未达到的索引。您只需要在 for 循环条件中将 替换为 即可。 (您从未分配过 f[n],因为循环从未达到 n,因此您获得了默认值。)

          int fibonacci(int n)
          {
              int f[100];
              f[0] = 0;
              f[1] = 1;
          
              for (int i=2; i<=n; i++)
              {
                  f[i] = f[i-2] + f[i-1];
              }
          
              return f[n];
          }
          
          int main()
          {
              cout << fibonacci(3);
              return 0;
          }
          

          顺便说一句,您不需要数组来执行 fib 序列。只需使用两个变量并在循环中重新分配它们。像这样的:

          int a = 0;
          int b = 1;
          
          for (int i=2; i<=n; i++)
          {
              b = a + b;
              a = b;
          }
          
          return b;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-14
            • 2014-05-03
            • 2010-11-24
            • 2017-11-18
            • 2013-02-24
            • 2016-08-09
            • 1970-01-01
            • 2011-09-30
            相关资源
            最近更新 更多