私は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
が奇数の場合
'int add = 0;'を初期化する必要があります。そうでなければ、 'total = add + Fibo(first、second、total) '行に格納されている場所に書かれた値を取ることができます(そして、明らかに); – UnholySheep
' bazooka'を修正しても、 '-1900183196'を取得します。確かにそれは間違っています。 – usr2564301
再帰関数は完全にオーバーキルです。より困難な質問のためにそのテクニックを保存してください。 1つの単純なループがそれを行います。限度が4000000であるため、32ビットマシンでは 'int'が適切です。 –