C++递归函数中的分段错误

0yg35tkg  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(151)
//void squarewall function below is showing error

void squareWall(int s) {
      static int count=0;
      if(count == s)
         return ;

      string t;
      for(int i=0;i<s;i++){
          t = t + "* ";
      }
      cout<<t<<"\n";
      count++;
      return squareWall(s);

}

我写了一个函数,在c++中使用单循环和递归调用来打印正方形的 *。它给出了自定义情况下的正确输出,但在提交时显示分段错误。有人能解释一下这里是什么情况吗?

sulc1iza

sulc1iza1#

因为变量count是静态的,它只声明一次,之后就不会被赋值为0,这就是为什么这个函数不会进入无限递归,也是为什么当你第二次调用这个函数时,* 它不会初始化计数器 *。
如果你做了这样的事

squareWall(size);
squareWall(size);

第一次调用成功,但是第二次,由于count仍然等于size,所以函数立即返回。
但是在这个例子中

squareWall(size);
squareWall(size - 1);

第一次调用仍然成功,但是第二次调用将返回到保护子句,因为count == sizes == size - 1,在那之后,你的函数将永远不会返回,所以它以无限递归结束,这在某个点上导致SEGFAULT。
在递归函数中使用静态变量通常不是一个好的做法,因为它往往会导致这样的情况。一个解决方案是将count声明为一个具有默认值的参数:

void squareWall(int s, int count = 0)
{
  if (count == s)
    return;

  string t;
  for (int i = 0; i < s; i++)
  {
    t = t + "* ";
  }
  
  cout << t << "\n";
  return squareWall(s, count + 1);
}

相关问题