2016-12-29 1 views
1

私はC言語の学習を始めました。私はEuler Problemsのいくつかを練習することに決めました。 動作していないプログラムは、問題2を解決するためのもので、4,000,000以下のフィボナッチ数でもすべての合計を計算するよう求められます。Cでの再帰は無関係なものを印刷するときにのみ役に立ちます

私は再帰関数の中で何かを印刷したときだけ、実際には動作しますが、再帰関数のprintf("bazooka");行をコメントアウトしようとすると、完全にランダムに見える結果が得られます。 (例えば、-882154758と770491113)を使用して、同じプログラムを連続して実行したときに発生します。 一方、何かを印刷すると、再帰関数で何が出力されても、正しい出力が得られます。

私はこの動作は非常に奇妙で面白い、と私は本当に何が起こっているのか知っていただきたいと思います。本当に私は困惑して出力された数は、プログラムが全く変更されていない場合であっても変化することです。また、私は、再帰中の印刷が、実行されている整数計算に何らかの影響を与えるべきである理由を理解していません。

これは私の主な機能です:

int first = 1; int second = 2; int total = 0; 
total = Fibo(first,second, total); 
printf("\nthis is my result for Euler 2: "); 
printf("%d",total); 

そして、これは私の再帰関数である:

int Fibo(int first, int second, int total) { 
    printf("bazooka"); 
    if (second < 4000000) { 
    int add; 
    second = first+second; 
    first = second-first; 
    if (first%2 == 0) { 
     add = first; 
    } 
     total = add+Fibo(first,second,total); 
    } 
    return total; 
} 

誰もが、私はこれを理解助けることができますか?私は本当にあなたの助けに感謝します。 firstが奇数の場合

+6

'int add = 0;'を初期化する必要があります。そうでなければ、 'total = add + Fibo(first、second、total) '行に格納されている場所に書かれた値を取ることができます(そして、明らかに); – UnholySheep

+1

' bazooka'を修正しても、 '-1900183196'を取得します。確かにそれは間違っています。 – usr2564301

+1

再帰関数は完全にオーバーキルです。より困難な質問のためにそのテクニックを保存してください。 1つの単純なループがそれを行います。限度が4000000であるため、32ビットマシンでは 'int'が適切です。 –

答えて

6

addが初期化されていません。どちらの場合も変数を初期化してください。バグは消えてしまいます。今

、観測された行動を説明する:ランダムな「値」として表示することができます初期化されていない変数を使用するか、プログラムが他のランダムな方法で誤動作することがあります。 (C言語の技術用語はundefined behaviorです。)あなたの場合、その値は関数のスタックフレームに使用されたメモリ位置の以前の使用から残ったゴミである可能性があります。登録。 printfへの呼び出しは、実装がメモリの関連部分を使用してクリアするため、問題を解決するように見えることがあります。言うまでもなく、これはあなたが依存できるものではありません。バグのこの種は、適切な警告設定でコンパイラによって診断されます

注意、GCCやクランのためのような-Wall

-3

まあ、私はその行動についての100%を関連付けることはできませんが、負の数のような数字を得るときあなたはint値の最大値を超えているので、確かに、次のとおりです。

INT_MIN = -2147483648 
INT_MAX = +2147483647 

変更するには、このタイプlongに、または同じ結果が得られた場合はlong longになります。

Hereデータタイプの境界を確認できます。

+1

これは公正な推測でしたが、もう1つの答えでわかるように、ここは原因ではありません。これが問題であるかどうかを確認する良い方法は、実際に中間値を出力することです。そうすることでそれは決して高くはないことが示されます。 – usr2564301

+0

このようにして、[int]は[problem](https://projecteuler.net/problem=2)に適しています。 –

+1

私の前のコメントを無視して、あなたのリンクに提示された値が奇妙で、あまり代表的ではないようです。私がcplusplus.comよりも[cppreference](http://en.cppreference.com/w/c/types/limits)を好む理由の1つ - 情報が通常より正確です。 (また 'INT_MIN'と' INT_MAX'は実際には定数ではなく、コンパイラによって異なります) – UnholySheep

関連する問題