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

新しいコード:

新しい問題は、さらに1つの数値を返す必要があります。たとえば、「n == 7」の場合、「8」ではなく「13」が返されます。

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 < ni == n-1。戻ってみてくださいf[n-1]

EDIT:Chris Lutzが指摘したように、あなたが電話した場合、無効な結果が得られるため、私の答えは良くありませんfibonacci(0)

多くの人がすでに答えているように、最善の解決策はi <= n
、もちろん、fibonacci(3)フィボナッチ数列の4番目ではなく3番目の要素を返したくない場合を除き、ループすることです。その場合fibonacci(0)、実際には意味がなく、正しい戻り値はbe f[n-1]... それでも、およびケースとn==0同様に、ケースは何らかの方法で処理する必要があります。n<0n>100

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 < nどこで)をテストすることですが、何も設定されていないものを返します。ランダムなガベージではなくゼロを取得しているのは「幸運」です。n == 3f[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;
}

制限 46 は、32 ビットの符号付き整数に対して正しいと経験的に判断されています。

出力例 #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 ループ条件で<<=に置き換えるだけです。(ループが n に達せず、デフォルト値が返されたため、 f[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 シーケンスを実行するために配列は必要ありません。2 つの変数を使用して、ループ内でそれらを再割り当てするだけです。このようなもの:

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

callfibonacci(3)を使用すると、for ループ (フィボナッチ関数内) は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 に答える