2016-08-15 27 views
-6

次のコードを実行しようとしましたが、結果はセグメンテーションフォルト(コアがダンプされた)です。どうすればエラーを修正できますか?また、私のコードは100のフィボナッチオーリアルを生成するでしょうか?私のコードは以下の通りです。エラーを修正するにはどうすればよいですか?

#include <iostream> 

using namespace std; 
int fib(int); 
int main() 
{ 
    int n; 
    int result[100]; 
    for (int i=0;i<100;i++){ 
     result[i] = fib(i); 
    } for (int i=0;i<100;i++){ 
     cout << i+ 1 << " : " << result[i] << endl; 
    } 

} 
int fib(int n){ 
    int re; 
    if (n==0||n==1){ 
     re = 1; 
    } else{ 
     re = fib(n)*fib(n - 1); 
    } 
    return re; 
} 

フィボナッチorial

フィボナッチ数列F(n)は、正の整数で、例えば次のように定義される:

1. F(1) = 1 
2. F(2) = 1 
3. F(n) = F(n-1) + F(n-2), where n is an integer and n > 2 

正の整数のフィボナッチorial製品であります[F(1)、F(2)、...、F(n)]のうち、

re = n * fib(n - 1); 

ため

re = fib(n)*fib(n - 1); 

か、無限ループになってしまいます。

n Fibonacci-orial of n 
1 1 
2 1 
3 2 
4 6 
5 30 
6 240 
7 3120 
8 65520 
9 2227680 
10 122522400 
11 10904493600 
12 1570247078400 
13 365867569267200 
14 137932073613734400 
15 84138564904377984000 
16 83044763560621070208000 
17 132622487406311849122176000 
18 342696507457909818131702784000 
19 1432814097681520949608649339904000 
20 9692987370815489224102512784450560000 
+2

このような問題を解決する適切なツールは、デバッガを使用することですが、そうする前にStack Overflowで尋ねることはありません。 1つ目の行でコードを検査するときに行ったすべての観察を教えてください。また、[**小さなプログラムをデバッグする方法(Eric Lippertによる)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)**]を読んでみてください。あなたの問題を再現する** [MCVE] **を私たちに任せてください。 (これは、πάνταῥεῖ™によって提供される個人的なコメントです) –

+0

セグメンテーションフォルトは、このような場合にはおそらく、再帰的な 'fib'コールがあまりにも遠すぎることを意味しています....終了条件を再確認してください。深さが大きすぎるため再帰ではなく反復的に書き直します –

+0

そして、このfib(n)はfib(n + 1)または-1を計算しています。いずれにしても、このレベルで+ -1を導入することは明確には役立ちません。おそらく '0'インデックスから' result [] 'に格納したかったでしょうか?むしろ 'result [101]'の0番目の要素を無駄にしたり、 'result [n-1] = fib(n)'を使って、 'fib'の中の' n'を1から上に保ちます。 (コースの終わりの 'if'を固定する)。したがって、あなたの 'fib()'は、理論式=>がバグを見つけやすくなるように直接見えます。やはり 'for'ループは' for(n = 1; n <= 100; ++ n) 'でなければなりません。人間にとどまらず、最後の手段としてのみロジックを機械に曲げてください。 – Ped7g

答えて

0

のフィボナッチorialジャストラインを変更します。

最初の100階乗番号の計算に関しては、あなたのコードで計算することができますが、結果はint変数に収まらなくなります。多くの情報については、大きな数字の階乗を計算することについてのSOの回答が複数あります:123

0

改行を変更する必要があります。 re = fib(n)* fib(n-1);

into: re = fib(n-2)+ fib(n-1);

fibonacciはfib(n)の代わりにfib(n-2)を呼び出すことで、無限の再帰関数呼び出しを削除すると考えています。

0
int main() 
{ 
    int n; 
    int result[100]; 
    int iPrevResult = 1; 
    for (int i=0;i<100;i++) 
    { 
     iPrevResult = iPrevResult* fib(i); 
     result[i] = iPrevResult; 
    } 

    for (int i=1;i<100;i++) 
    { 
     cout << i+ 1 << " : " << result[i] << endl; 
    } 
} 
int fib(int n){ 
    if (n<=1){ 
     return 1; 
    } 
    return (fib(n-1) +fib(n-2)); 
} 
関連する問題