2016-11-06 83 views
-4

我不明白爲什麼這返回5時輸入5? 每次函數都可以進行減法時,是否返回1?然後添加所有這些?C++遞歸,我不明白

#include <iostream> 
using namespace std; 
int Fibonacci(int); 
int Fibonacci(int x) 
{ 
    if (x == 0) return 0; // Stopping conditions 
    if (x == 1) return 1; 
    return Fibonacci(x - 1) + Fibonacci(x - 2); 
} 
int main() { 
    int num; 
    cin >> num; 
    cout << Fibonacci(num) << endl; 
    return 0; 
} 
+2

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

你停止條件返回一個你想要的索引的錯誤結果 – StoryTeller

+0

@StoryTeller停止條件有意義索引是基於零的,但是一個零點是零,而不是一個。子1是1,子2也是,這意味着子5應該是5。 –

回答

0

0,1,1,2,3,5是它計算得到的值爲5.當詢問任何元素,但前兩個(這裏索引爲sub 0和sub 1 )它添加了前兩個元素(這些減法是對序列的索引,而不是值)。一個子零被設置爲0和子一個爲1。

1

爲了清楚起見,使用函數

auto F(int x) 
    -> int 
{ return (x <= 1? x : F(x-2)+F(x-1)); } 

F(5)
→ F(3)+ F(4)
→ (1 +(F(0)+ F(1))+ F(4)
→(F + + F(4)
→(1 +(0 + F(1)))+ F(4)
→(1 +(0 + 1))+ F(4)
→(1 + 1)+ F(4)
→ 2 + F(4)
→ 2 +(F(2)+ F (3))
等...&hellip;

+0

無關的問題。不能從'x'推斷返回類型嗎?還是遞歸調用讓我們別無選擇,只能提到尾隨返回類型? – StoryTeller

+1

確實可以推斷出返回類型。我只是希望明確哪裏是實用的。我認爲它使代碼更易於閱讀,並且防止編輯改變*預期*返回類型。 –