c++斐波那契错误

C++ Fibonacci Errors

本文关键字:错误 c++      更新时间:2023-10-16

我在这个非递归斐波那契函数上遇到了一些麻烦。我正在使用这个数字数组并将其传递给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只是极限。
仅供参考,返回语句中的大括号( )是不需要的,您可以忽略它们。


我正在使用这个数字数组并将其传递给FiboNR

您不应该这样做,因为FiboNR()将其参数例外为整数(一个,而不是整数数组)。因此,您应该只向函数传递一个数字,如:FiboNR(n[2])

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

将数组类型从int改为long long

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

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

int | 4bytes| -2147483648 to 2147483647

链接:c++数据类型

下面的代码示例:

#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;
}