【问题标题】:Different output on recursive call using static variable [closed]使用静态变量进行递归调用的不同输出[关闭]
【发布时间】:2020-05-21 09:41:39
【问题描述】:
int fun1(int x){
    static int n;
    n = 0;
    if(x > 0){
        n++;
        return fun1(x-1)+n;
    }
    return 0;
}
int fun(int x){
    static int n = 0;
    if(x > 0){
        n++;
        return fun(x-1)+n;
    }
    return 0;
}

谁能告诉我 fun 和 fun1 之间的区别? 得到不同的输出!!

【问题讨论】:

  • 除了多标记(这是 C 还是 C++)以及在这两种情况下您没有告诉我们输入和输出是什么这一事实之外,并且缺少 main 这本来是有用的,这是一个很好的问题。请花时间修改它。
  • 谢谢您会记录下来

标签: c++ c recursion static


【解决方案1】:
  1. static int n = 0;是一次性初始化

像下面的sn-p,

    bool initialized = false;
    static int n;

    int fun1(int x){ 
       if(!initialized){
          n = 0;
          initialized = true;
       }
        if(x > 0){
            n++;
            return fun1(x-1)+n;
        }
        return 0;
    }
  1. static int n; n =0 在每次递归调用时重置为零。如下所示,
    bool initialized = false;
    static int n;
    int fun(int x){
       if(!initialized){
          n = 0;
          initialized = true;
       }
       n = 0;
        if(x > 0){
            n++;
            return fun(x-1)+n;
        }
        return 0;
    }

实际上n.BSS 的一部分,并在加载时初始化为零。

【讨论】:

  • 从技术上讲,第二种情况不是初始化。这是一项任务。
  • @klutt :这只是重置吗?请验证我的更新
  • 您可以在此处阅读有关初始化的信息:port70.net/~nsz/c/c11/n1570.html#6.7.9
  • 简化:初始化在编译时完成,而分配在运行时完成
  • @klutt,这可能是结束-简化了 - 函数范围内的静态变量的初始化发生在 第一次调用函数时
【解决方案2】:

fun1中,每次调用函数时,n都设置为0

fun 中,n 在程序启动时被初始化为0,但此后仅由n++ 更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 2020-12-18
    • 2018-01-08
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多