2014-02-14 39 views
-1

我剛開始自己​​學習C++。我現在試圖練習複習。我想用遞歸方式打印所有n(由用戶輸入)斐波那契數字,但它不起作用。你可以幫幫我嗎?謝謝!!在C++中使用遞歸打印斐波納契數列

#include <iostream> 
using namespace std; 
int fibonacci(int n) 
{ 
    if (n==1) 
    { 
     return 1; 
     cout<<1<<" "; 
    } 
    else if (n==2) 
    { 
     return 1; 
     cout<<1<<" "; 
    } 
    else 
    { 
     return (fibonacci(n-1)+fibonacci(n-2)); 
     cout<<fibonacci(n-1)+fibonacci(n-2)<<" "; 
    } 
} 
int main() 
{ 
    int n; 
    cin>>n; 
    fibonacci(n); 
    return 0; 
} 
+0

你有什麼期望代碼'return'後做什麼? –

+7

返回**後的代碼*不會執行**。畢竟,你*返回到調用函數。 – crashmstr

+1

你想要的結果,所以:'cout << fibonacci(n);' – marcinj

回答

3

如果你看看Rosetta Code page for Fibonacci,你會看到F(0) == 0F(1) == 1

int fibonacci(int n) 
{ 

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

    return fib; 
} 

在這種情況下,你有一個函數可以計算特定位置的斐波那契數,對嗎?

所以,現在你需要計算它們,然後打印出來:

int main() 
{ 
    int n; 
    cin >> n; 

    if (n < 0) 
    { 
     return -1; // This means there was an error 
    } 

    for (int i = 1; i < n; ++i) 
    { 
     cout << fibonacci(i) << " "; 
    } 

    return 0; 
} 

注意,這是不是最有效的方式做到這一點在所有,但它有點幫助你理解遞歸是如何工作的。

+0

然後,您可以搜索memoization的含義。 – MatthieuW

+0

那麼[記憶](http://en.wikipedia.org/wiki/Memoization)實際上只是一種說法,「不要兩次計算相同的東西」。 –

2

即使您在return語句前加上cout,你的代碼不會給你以正確的順序斐波納契數列。假設您要求fibonacci(7)。它將打印fibonacci(6)的所有中間計算,然後它將打印全部爲1的fibonacci(5)

+1

它更復雜,因爲「COUT」線路也引發了遞歸。 – MatthieuW

2

無需在斐波那契功能COUT,只有COUT通過INT主()循環......也改變,如果 條件斐波那契功能< = 0,否則它會給你一個分段錯誤(錯誤)

#include <iostream> 
using namespace std; 
int fibonacci(int n) 
{ 
    if (n<=0) 
    { 
     return 0; 
    // cout<<1<<" "; 
    } 
    else if (n==1) 
    { 
     return 1; 
    // cout<<1<<" "; 
    } 
    else 
    { 
     return (fibonacci(n-1)+fibonacci(n-2)); 
    // cout<<fibonacci(n-1)+fibonacci(n-2)<<" "; 
    } 
} 
int main() 
{ 
    int n; 
    cin>>n; 
    for (int x = 0; x < n; x++) 
    cout << fibonacci(x) << " "; 
    cout << endl; 

    return 0; 
} 
+0

n <= 0是必要的,因爲它返回,否則返回-1 + -2 = -3,這會產生分段錯誤... – Shaan

+0

也可以在返回後調用cout ...所以它不會執行b – Shaan