//assume (main function)
int fibonacci(int a,int b){
//int i inifinite loop(why?)
static int i=1;
if(i==terms){
return 0;
}
else{
int c;
c=a+b;
a=b;
b=c;
printf(" %d ",c);
i++;
fibonacci(a,b);
return 0;
}
}
如果我在斐波那契函数(定义函数)中声明i
变量,它会打印垃圾值的无限循环,而不是我使用静态i
变量,那么代码会打印斐波那契系列,请解释一下静态变量在此代码中是如何工作的?
1条答案
按热度按时间raogr8fs1#
如果声明变量
i
具有自动存储持续时间那么在函数的每次递归调用中变量
i
被值1
重新初始化并且你有递归调用的无限循环。当您声明变量
i
具有静态存储持续时间时则在程序开始之前仅初始化它一次。
在任何情况下,你的函数都是不正确的,因为即使变量
i
被声明为具有静态存储持续时间,它也不会在递归函数调用后被重置为初始值。此外,当一个函数依赖于一个全局变量时,这是一个糟糕的方法,因为你的函数依赖于全局变量terms
。此外,斐波那契数列是一个固定数列,用户不应该指定变量
a
和b
,而应该为函数指定他要得到的数列中的数字的索引,并且函数应该返回这个数字而不是返回0。例如,函数可以按以下方式定义
这是一个演示程序。
程序输出为