我剛剛開始學習C,我決定在練習中使用一些Euler Problems。 不工作的程序旨在解決Problem2,它要求計算所有甚至低於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;
}
任何人可以幫助我弄清楚了這一點?我非常感謝你的幫助。
你需要初始化'int add = 0;'。否則,它可以(顯然確實)把它存儲在'total = add + Fibo'(第一,第二,總計)行中的任何值寫入' – UnholySheep
即使使用你的'bazooka'修復程序,I得到'-1900183196'。當然這是錯誤的。 – usr2564301
遞歸函數是完全過度銷燬的。將這種技術用於更難的問題。一個簡單的循環就可以做到。由於限制是4000000' int'對於32位機器已經足夠了。 –