递归实现斐波那契数列时static变量的作用及问题解析
递归斐波那契代码中static变量的工作机制解释
先贴出对应的代码:
// 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声明成普通局部变量(去掉static),会直接触发无限循环:
- 要是没显式初始化
i,它会是随机的垃圾值,永远碰不到i==terms的终止条件,递归无限进行,输出一堆无意义的垃圾值。 - 就算显式写
int i=1,每次递归调用fibonacci都会重新创建一个独立的i并初始化1。每一层递归里的i都是互不干扰的,永远到不了等于terms的时刻,递归根本停不下来,最终会导致栈溢出或者无限重复输出。
static变量的工作机制
用static修饰的局部变量,和普通局部变量有两个核心差异:
- 生命周期覆盖整个程序运行期:它的内存空间在程序启动时就分配完成,直到程序结束才释放,全程只有这一份实例。
- 初始化仅执行一次:只有第一次调用
fibonacci时,static int i=1会完成初始化;后续所有递归调用,都会直接复用之前已经存在的i的值,不会再重新初始化。
放到这段代码里具体来看:
- 第一次调用函数时,
i被初始化为1,打印第一个斐波那契数后i自增为2; - 第二次递归调用,直接使用当前的
i=2,打印后自增为3; - 以此类推,直到
i的值等于terms,触发终止条件,递归链条停止,程序就能正常打印指定数量的斐波那契数列。
内容的提问来源于stack exchange,提问作者Creator Magic
相关产品推荐
相关产品推荐

