我需要创建一个程序,要求用户输入整数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。
答案 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
>