我对这种非递归的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]);
}
该功能是由教练提供的功能,如果他发出功能我认为它是正确的但是由于这些记忆错误我不能完全理解发生了什么。我在循环中调用循环来遍历数组并输出答案的唯一方法,如cout << FiboNR(n[i]);
答案 0 :(得分:0)
首先,你的麻烦是循环的。替换:
F[n] = F[n - 1] + F[n - 2];
使用:
F[i] = F[i - 1] + F[i - 2];
因为 i 是你的迭代器而 n 只是限制。
仅供参考,不需要返回语句中的大括号( )
,您可以忽略它们。
我正在使用这个数字数组并将其传递给FiboNR
你不应该那样做,因为FiboNR()除了它的参数是一个整数(一个,不是一个整数数组)。因此,您只应将一个数字传递给您的函数,例如:FiboNR(n[2])
。
答案 1 :(得分:0)
由于int数组的int溢出(n> 46),您得到负数。
将数组类型从 int 更改为 long long 。
其他解决方案:将数组类型更改为float / double类型,结果精度较低或使用长算法。
输入|典型的位宽|典型范围
int | 4字节| -2147483648至2147483647
以下代码示例。
#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;
}