需要帮助来更正我的斐波那契数列代码

时间:2019-05-02 13:44:02

标签: c recursion fibonacci

我需要创建一个程序,要求用户输入整数N,然后使用void函数为fibonacci序列打印出fibonacci序列的前N个术语。在一个实例之后,程序必须询问用户是否希望继续。如果用户回答Y,则程序必须询问用户另一个整数N,然后打印出斐波那契数列的前N个项,依此类推。

我已经为此编写了代码。它首先起作用。问题是,如果用户选择再次执行此操作,则结果将不再是正确的斐波那契数列。下面是代码。

#include<stdio.h>

void printFibonacci(int n){
    static int n1=0,n2=1,n3;
    if(n>0){
         n3 = n1 + n2;
         n1 = n2;
         n2 = n3;
         printf("%d ",n3);
         printFibonacci(n-1);
    }
}

int main()
{
    int n;
    char choice;
    printf("Enter the number of elements: ");
    scanf("%d",&n);
    printf("Fibonacci Series: ");
    printf("%d %d ",0,1);
    printFibonacci(n-2);//n-2 because 2 numbers are already printed

    printf("\nDo you wish to continue?(Y/N)");
    scanf(" %c", &choice);

    while (choice=='Y')
    {
        printf("Enter the number of elements: ");
    scanf("%d",&n);
    printf("Fibonacci Series: ");
    printf("%d %d ",0,1);
    printFibonacci(n-2);//n-2 because 2 numbers are already printed

    printf("\nDo you wish to continue?(Y/N)");
    scanf(" %c", &choice);
    }
  return 0;
 }


预期结果是斐波那契数列。当我运行上面的代码时,如果我说N = 5,它会给出正确的结果: 0,1,1,2,3。 问题出在我对“您是否要继续?(是/否)”回答“是”之后。如果我再次输入N = 5,我希望得到0,1,1,2,3,但是我得到0,1,5,8,13。

2 个答案:

答案 0 :(得分:2)

您的问题是使用那些静态变量。它们将其值保持在范围之外,这意味着调用该函数时,n1和n2都将具有其最后分配的值。
我通过传递参数n1和n2解决了这个问题。这些功能取代了您的printFibonacci。

void printFibonacci2(int length, int n1, int n2) {
    int n3;
    if(length > 0) {
        n3 = n1 + n2;
        n1 = n2;
        n2 = n3;
        printf("%d ", n3);
        printFibonacci2(length - 1, n1, n2);
    }
}

void printFibonacci (int n)
{
  printFibonacci2(n, 0, 1);
}

您可以修饰代码,但问题已解决。

答案 1 :(得分:2)

我们可以通过向else添加printFibonacci()大小写以在n == 0时重置其静态变量来保留您的函数签名:

#include <stdio.h>

void printFibonacci(int n) {
    static int n1 = 0, n2 = 1, n3;

    if (n > 0) {
        n3 = n1 + n2;
        n1 = n2;
        n2 = n3;
        printf("%d ", n3);
        printFibonacci(n - 1);
    } else {
        n1 = 0;
        n2 = 1;
    }
}

int main()
{
    int n;
    char choice = 'Y';

    while (choice == 'Y')
    {
        printf("Enter the number of elements: ");
        scanf("%d", &n);
        printf("Fibonacci Series: ");
        printf("%d %d ", 0, 1);
        printFibonacci(n - 2); // n - 2 because 2 numbers are already printed
        printf("\n");

        printf("Do you wish to continue? (Y/N): ");
        scanf(" %c", &choice);
    }

    return 0;
}

不是我的第一选择,而是解决一个混乱问题的最简单方法:

> ./a.out
Enter the number of elements: 10
Fibonacci Series: 0 1 1 2 3 5 8 13 21 34 
Do you wish to continue? (Y/N): Y
Enter the number of elements: 10
Fibonacci Series: 0 1 1 2 3 5 8 13 21 34 
Do you wish to continue? (Y/N): N
>