应该返回数组的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;
}
答案 0 :(得分:4)
您的循环终止条件错误。既然这是作业,也许你可以找出原因。
答案 1 :(得分:4)
好吧,你永远不会设置f[n]
,你最多只能i < n
,即i == n-1
。
尝试返回f[n-1]
fibonacci(0)
会导致无效结果
许多人已经回答过,最好的解决办法是循环到i <= n
当然,除非你希望fibonacci(3)
返回fibonacci序列中的第3个元素而不是第4个元素,在这种情况下fibonacci(0)
实际上没有意义,正确的返回值将是{{ 1}} ... f[n-1]
案例应该以某种方式处理,n==0
和n<0
案例也应如此。
只要您检查正确的边界,就可以返回n>100
:
f[n-1]
答案 2 :(得分:3)
您忘记初始化数组的第n个值。您返回f [n]但仅初始化为n-1。
答案 3 :(得分:2)
问题是您要测试i < n
(示例调用中的n == 3
),但是您返回的f[3]
尚未设置为任何内容。你很幸运,你得到零而不是随机垃圾。
将“<
”更改为“<=
”。
保留全尺寸阵列。
#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;
}
fib(0) = 0
fib(1) = 1
fib(2) = 1
fib(3) = 2
fib(4) = 3
fib(5) = 5
fib(6) = 8
fib(7) = 13
这使用大小为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;
}
它产生相同的输出 - 因此重复它没有意义。
避免数组和模运算:
#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;
}
根据经验确定极限46对于32位有符号整数是正确的。
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
答案 4 :(得分:2)
n是您的版本中从未达到的索引。您只需要在for循环条件中将&lt; 替换为&lt; = 。 (你从未指定过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;
答案 5 :(得分:1)
通过调用fibonacci(3)
,你的for循环(在fibonacci函数内)一直持续到i < 3
......
这意味着最后一个分配是f[2]
。不按预期f[3]
(这是您返回的值)。
答案 6 :(得分:0)
我猜你的编译器已将数组f [100]设置为0?
看起来另一个人有正确的答案......