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

Is my understanding of how variables work in recursive function correct?

本文关键字:是否 工作 变量 递归函数 何工作      更新时间:2023-10-16

我最近在我的C++类中得到了递归,我想知道认为变量的作用域是特定堆栈帧的局部是否正确:

3) 退货

2) 翻转字符串(" ");开始 = a,结束 = t

1) 翻转字符串(在);开始 = s,结束 = r

因此,当它到达返回语句时,它将弹出 第三帧关闭,

然后第二帧关闭,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;
}

是的,你对函数如何工作和函数本身的想法似乎是正确的。

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

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

如果传递了一个纯函数参数(没有引用,也不是作为指针),则在每个调用堆栈级别也会有一个单独的参数副本。

在此上下文中,需要了解三种符号类型:

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

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

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

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

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

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