You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归实现斐波那契数列时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修饰的局部变量,和普通局部变量有两个核心差异:

  1. 生命周期覆盖整个程序运行期:它的内存空间在程序启动时就分配完成,直到程序结束才释放,全程只有这一份实例。
  2. 初始化仅执行一次:只有第一次调用fibonacci时,static int i=1会完成初始化;后续所有递归调用,都会直接复用之前已经存在的i的值,不会再重新初始化。

放到这段代码里具体来看:

  • 第一次调用函数时,i被初始化为1,打印第一个斐波那契数后i自增为2;
  • 第二次递归调用,直接使用当前的i=2,打印后自增为3;
  • 以此类推,直到i的值等于terms,触发终止条件,递归链条停止,程序就能正常打印指定数量的斐波那契数列。

内容的提问来源于stack exchange,提问作者Creator Magic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:15:31