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

Cod*_*ust 0 c++ string recursion function c++17

//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);

}
Run Code Online (Sandbox Code Playgroud)

我已经编写了使用单循环和递归调用在 C++ 中打印 * 方形图案的函数。它为自定义案例提供正确的输出,但在提交时显示分段错误。有人可以解释一下这里的情况吗?

Igo*_*nin 5

由于您的变量count是静态的,因此它被声明一次,之后就不会被分配零。这就是为什么这个函数不会进入无限递归,但这也是为什么当您第二次调用函数时,它不会初始化 counter

所以,如果你做这样的事情

squareWall(size);
squareWall(size);
Run Code Online (Sandbox Code Playgroud)

第一次调用成功,但第二次调用时,由于count仍然等于size,因此您的函数立即返回。

然而,在这个例子中

squareWall(size);
squareWall(size - 1);
Run Code Online (Sandbox Code Playgroud)

第一次调用仍然成功,但第二次调用不会返回到保护子句,因为count == size, s == 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);
}
Run Code Online (Sandbox Code Playgroud)