2016-07-06 102 views
1

我該如何得到這段代碼來打印給定項的斐波那契數列的所有值?現在它只打印最後一期遞歸和斐波那契數列

#include <stdio.h> 

int fibonacci(int n){ 

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

} 


int main() 
{ 

    int n; 
    int answer; 
    printf("Enter the number of terms you'd like in the sequence\n"); 
    scanf("%d",&n); 

    answer = fibonacci(n); 
    printf("The answer is %d\n", answer); 

} 
+1

將'if(n == 2)'更改爲'if(n == 1 || n == 0)'。 –

+0

[93]已經存在的關於C語言遞歸斐波那契數的實現的問題(http://stackoverflow.com/search?q=%5Bc%5D+fibonacci+recursion)向您揭示了什麼? – Lundin

回答

5

您的基本情況不正確。當n==2時,您會撥打fibonacci(1)fibonacci(0)。後者將繼續向下,直到您用盡堆棧空間。

您應該檢查數字少於等於基本情況:

if (n<=2) 

編輯:

如果你想打印的所有值,你不能做到這一點的方式該函數當前由於雙遞歸而結構化。

如果您追蹤之前計算的數字,則可以完成。然後你只在第一次計算一個數字時打印一個數字(並執行遞歸),否則從列表中查找並繼續。

int fibonacci(int n){ 
    static int seq[50] = {0}; 

    if (n > 50) { 
     printf("number too large\n"); 
     return 0; 
    } 
    if (seq[n-1] == 0) { 
     if (n<=2) { 
      seq[n-1] = 1; 
     } else { 
      seq[n-1] = fibonacci(n-1) + fibonacci(n-2); 
     } 
     printf("%d ", seq[n-1]); 
    } 
    return seq[n-1]; 
} 

輸出:

Enter the number of terms you'd like in the sequence 
10 
1 1 2 3 5 8 13 21 34 55 The answer is 55 

注意,上述功能具有50個限度,因爲結果是在圍繞該範圍過大,爲32位的int。

+0

+1此外,該問題希望「打印給定項的斐波那契數列的所有值」。如果可能,請改善您的答案。 –

+0

目前還不清楚爲什麼程序在'n'甚至達到50時開始溢出時允許/存儲'n'到1000。 – cdlane