2012-02-09 6 views
1

私のロジックの不具合はわかりません。サンプル出力:私の再帰フィボナッチプログラムで何が問題になっていますか?

How many terms of the Fibonacci Sequence do you wish to compute? 
1 
1 
1 
--How many terms of the Fibonacci Sequence do you wish to compute? 
5 
5 
5 
5 
5 
5 
5 

これはなぜですか?あなたのループで

// Recursive Fibonacci Sequence 
#include <iostream> 
using namespace std; 

double fib(double number); 

int main(void) { 
     double number; 
     cout << "How many terms of the Fibonacci Sequence do you wish to compute?" << endl; 
     cin >> number; 

     for(int i = 0; i <= number; ++i) 
       cout << fib(number) << endl; 
} // end main 

// function fib definition 
double fib(double number) { 
     if((number == 0) || (number == 1)) 
       return number; 
     else 
       return fib(number - 1) + fib(number - 2); 
} // end function fib 

答えて

9

ルック:ループの本体はiを使用しない方法

for(int i = 0; i <= number; ++i) 
    cout << fib(number) << endl; 

お知らせ...それは常にfib(number)を呼び出します。それをfib(i)に変更すると修正されます。

(それはあなたが値を毎回再計算終わるだろうという点で、ひどく効率的ではないのですが、あなたはで何をすべきか」の懸念をミックスfibでの印刷を、置くこともできますがそれは。別の問題です結果「と 『フィボナッチ数列を計算する』。)

+1

のために」それはひどくはありません効率的な " - それはthですenaïve、O(2^n)のフィボナッチ数列の解。しかし+1。 –

+0

ああ、私は...ありがとう。男は私が愚かだと感じる#_ –

+0

@larsmans:それはn回繰り返されているので、それより悪いです。 'fib'関数が単純なO(n)反復手法に変更されても、それはまだ不必要にO(n^2)になるでしょう - それを丸める方法がありますが、問題の範囲を超えていると思います。 –

1

はそれを作る:

for(int i = 0; i <= number; ++i) 
    cout << fib(i) << endl; 
+3

また、直接比較にはダブル数字を使用しないでください。この場合、フィボナッチ数は常に整数にすぎません。 – PermanentGuest

+0

この場合、比較に問題はありません。彼が比較した数は、正確な積分値として始まり、デクリメントされるので、正確な積分値のままでなければなりません。 –

+0

@Unni:それは常に整数ですが、42億を超える数値を処理することは可能です –

1

あなたは単に 『i』は、パラメータとして渡す必要がありますあなたのループではない 『数』

関連する問題