2013-11-24 100 views
0

以下是我的代碼。我試圖打印斐波那契遞歸函數[在最後],但它給了我段錯誤。我的代碼有什麼問題?我花了3個小時在這個,並無法弄清楚。有人可以請客氣,給我一些幫助?由於C++遞歸Febonacci函數

int fibonacci (int x) { 


    if (x == 0) { 
     return 0; 
    } 
    else if (x == 1) { 
     return 1; 
    } 
    else { 
    return (fibonacci(x-1) + fibonacci (x + 2)); 
    } 
} 
+1

凡(又名,什麼線),你得到的賽格故障? – Krease

+0

斐波那契函數適用於打印。 – NewFile

回答

1

目前遞歸永遠不會結束,因爲:

return (fibonacci(x-1) + fibonacci (x + 2)); 

應該

return (fibonacci(x-1) + fibonacci (x - 2)); 

當前的代碼會導致內存溢出,因爲你不斷添加功能棧調用無限和在堆棧內存不足的地方,你會遇到崩潰。您可以通過樣本編號查看執行流程時發生的情況:

fibonnaci(2) = fibonacci(1)+fibonacci(4) 
      = 1 + (fibonacci(3)+fibonacci(6)) 
      = 1 + (((fibonacci(2)+fibonacci(5))+(fibonacci(5)+fibonacci(8))) 
      = 1 + ....... 

正如您所看到的,這絕不會終止。

+0

複製粘貼錯誤?你的修正仍然有x + 2(編輯 - 你去那裏) – Krease

+0

是的,複製粘貼錯誤:)現在應該修復 – shuttle87

4

最有可能你得到段錯誤,因爲您的堆棧增長沒有節制,這是因爲該行的:

return (fibonacci(x-1) + fibonacci (x + 2)); 

調用斐波那契()比原來更大的值會導致非遞歸的情況下,永遠不會到達,導致堆棧最終溢出,或試圖這樣做,因爲SO會檢測到這一點並終止您的過程。

所以,重寫行這樣的:

return (fibonacci(x-1) + fibonacci (x - 2)); 
+1

我剛注意到這個,然後你發佈了答案:) – Krease

+0

非常感謝你們 – NewFile