3

应该返回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;
}
4

7 回答 7

4

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

于 2010-12-03T20:53:16.620 回答
4

好吧,你永远不会设置f[n],你只会上升到i < n,也就是说,i == n-1。尝试返回f[n-1]

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

就像许多人已经回答的那样,最好的解决方案是循环直到i <= n
,当然,除非您想fibonacci(3)返回斐波那契数列中的第三个元素而不是第四个元素,在这种情况下fibonacci(0)实际上没有意义,正确的返回值将be f[n-1]... 仍然n==0应该以某种方式处理这种情况,就像 then<0n>100case 一样。

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];
}
于 2010-12-03T20:54:11.133 回答
3

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

于 2010-12-03T20:52:55.357 回答
2

问题是您测试i < nn == 3在您的示例调用中的位置),但您返回f[3]尚未设置任何内容。你'幸运'你得到零而不是随机垃圾。

将“”更改为<<=”。


工作代码#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 位有符号整数,根据经验确定限制 46 是正确的。

示例输出#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
于 2010-12-03T20:54:00.440 回答
2

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;
于 2010-12-03T20:57:41.987 回答
1

使用 call fibonacci(3),您的 for 循环(在 fibonacci 函数内)一直持续到i < 3...

这意味着最后一个分配是f[2]。不像f[3]预期的那样(这是您返回的值)。

于 2010-12-03T20:55:04.260 回答
0

你不是说 return f[n-1];

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

看起来另一个人有正确的答案......

于 2010-12-03T20:57:19.663 回答