2016-07-06 104 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