C++ 斐波那契错误

C++ Fibonacci Errors

我在使用这个非递归 Fibonacci 函数时遇到了一些问题。我正在使用这个数字数组并将其传递给 FiboNR,但是我得到了很大的负值和访问冲突错误。

int n[15] = { 1,5,10,15,20,25,30,35,40,45,50,55,60,65,70 };

int FiboNR(int n) // array of size n
{
     int const max = 100;
     int F[max];
     F[0] = 0; F[1] = 1;
     for (int i = 2; i <= n; i++) {
         F[n] = F[n - 1] + F[n - 2];
     }
  return (F[n]);
}

该功能是由讲师提供的,如果他给出它,我认为它是正确的,但由于这些内存错误,我不完全理解发生了什么。我在循环中调用 in 遍历数组并输出 cout << FiboNR(n[i]);

之类的答案的唯一方法

首先,你的毛病在循环中。替换:

    F[n] = F[n - 1] + F[n - 2];

与:

    F[i] = F[i - 1] + F[i - 2];

因为 i 是您的迭代器,而 n 只是限制。
仅供参考,return 语句中的大括号 ( ) 不需要,您可以忽略它们。


I am using this array of numbers and passing it to FiboNR

你不应该这样做,因为 FiboNR() 除了它的参数是一个整数(一个,不是整数数组)。所以你应该只传递一个数字给你的函数,比如:FiboNR(n[2]).

由于 int 数组 (n > 46) 的 int 溢出,您得到一个负数。

将数组类型从 int 更改为 long long

其他解决方案:将数组类型更改为结果精度较低的float/double类型或使用长算法。

类型 |典型位宽 |典型范围

内部 | 4字节| -2147483648 至 2147483647

Link: C++ Data Types

下面的代码示例。

#include <iostream>   

long long FiboNR(int n);    

long long FiboNR(int n) {
  int const max = 100;
  long long F[max];

  if (n > max) {
    n = max;
  }

  F[0] = 0;
  F[1] = 1;

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

int main() {

  for (int i=0; i < 100; i++) {
    std::cout << "i = " << i << " : " << FiboNR(i) << std::endl;
  }
  return 0;
}