我对变量在递归函数中如何工作的理解是否正确?

时间:2017-05-23 04:26:26

标签: c++ recursion

我最近在C ++类中得到了递归,我想知道变量的范围是特定堆栈框架的本地是正确的:

  

3)返回

     

2)flipString(“”); begin = a,end = t

     

1)flipString(at); begin = s,end = r

所以当它到达return语句时它会弹出 第三帧关闭,

然后第二帧关闭,s = t +“”+ a

然后是s = r + at + s的第一帧,从而反转字符串。

void flipString(string &s)
{
   if (s.size() < 2)
   {
      return;
   }
   else
   {

      string begin;
      string end;      

      begin = s.at(0);
      end = s.at(s.size()-1);

      s.erase(s.begin());
      s.erase(s.end()-1);

      flipString(s); 

      s = end + s + begin;   
   }

   return;
}

2 个答案:

答案 0 :(得分:2)

是的,您对该功能如何工作以及功能本身看似正确的想法。

在函数的每次调用中,有一个不同的局部变量实例开始和结束,放在堆栈上。

函数参数s引用或指向所有堆栈帧中的相同字符串,因为它是一个引用。

如果传递普通函数参数(没有引用而不是指针),那么在每个调用堆栈级别也会有一个单独的参数副本。

答案 1 :(得分:1)

在这种情况下,有三种符号类型需要理解:

  1. 局部变量 - 在函数中声明的符号
  2. 形式参数 - 在函数实现中用作参数的符号
  3. 实际参数 - 调用者在函数调用
  4. 上传递的表达式

    了解值的存储位置以及堆栈的工作方式也很有用。

    为每个函数调用创建一个堆栈帧。这为函数的执行创建了一个上下文,并引用了调用者的上下文。当函数退出时,删除(弹出)函数的堆栈帧并恢复调用者的上下文。

    正式参数&#39;位置保留在被调用函数的堆栈帧中。类似地,局部变量存储在函数的堆栈帧中。实际参数或对它们的引用被复制到堆栈,在那里它们可以由它们的形式参数对应物引用。

    当函数退出时,堆栈框架将与形式参数和局部变量空间一起释放。

    请注意,对于作为引用(&)传递给实际值的参数,值的空间可能存在于当前堆栈帧之外(只有引用地址本身位于堆栈帧内)。忘记这一点可能会让人混淆为什么值在函数调用中持久化。对于指针来说这更为明显,但在传递引用时可能会被忽略。