C++ 对带有传递引用参数的函数使用递归?
对于我的void函数reverse,我必须得到一个字符串并用递归将其反转 到目前为止,我已经C++ 对带有传递引用参数的函数使用递归?,c++,recursion,C++,Recursion,对于我的void函数reverse,我必须得到一个字符串并用递归将其反转 到目前为止,我已经 void reverse(string &s) { string b = s; s = s.substr(1) + s.at(0); } 但由于函数的引用传递要求,它无法工作。如何利用引用传递进行递归 那么: void _reverse(string& s, size_t z0, size_t z1) { if (z1 <= z0) ret
void reverse(string &s)
{
string b = s;
s = s.substr(1) + s.at(0);
}
但由于函数的引用传递要求,它无法工作。如何利用引用传递进行递归 那么:
void _reverse(string& s, size_t z0, size_t z1)
{
if (z1 <= z0)
return;
auto aux = s[z0];
s[z0] = s[z1];
s[z1] = aux;
_reverse(s, z0 + 1, z1 - 1);
}
void _reverse(string& s)
{
_reverse(s, 0, s.length() - 1);
}
int main()
{
string x = "hello my friend";
_reverse(x);
cout << x << endl;
}
void\u反向(管柱和s,尺寸为z0,尺寸为z1)
{
如果(z1作为记录,下面是我回答时的函数:
void reverse(string &s)
{
s = reverse(s.substr(1)) + s.at(0);
}
这里有多个问题:
首先,您使用char
reverse
添加reverse
的结果,返回void
,因此这不起作用。其次,substr创建一个新字符串,通过引用传递一个temp会带来麻烦。最后,在递归中,您需要一个退出条件。实际上,您的方法正在尝试获取sub长度为1时的str
以下是一个有效的版本:
void reverse(string &s)
{
if (s.size() == 1)
return;
string sub = s.substr(1);
reverse(sub);
s = sub + s.at(0);
}
你必须通过引用传递吗?是的,它必须通过引用传递。发布你的真实代码。s
没有类型,因此你的其余代码是可疑的。reverse
不返回值,但你希望返回值。这是如何递归的。在reverse
@EricFortin中不调用reverse
-希望人们不要这样做-使注释/答案变得毫无意义。至少使用std::swap
交换值。我只能使用给定的函数,对此赋值进行反转。没有循环,也没有迭代器。函数如何以s.size结束其循环?不会保持输入的大小吗?如果要反转的字符串长度为1,则反转为same字符串,所以不要再次调用reverse,否则它将永远递归。我明白了。那么对于s=sub+s.at(0);,函数将在sub清空时终止?我遇到了无限循环的问题,因为它一直在不停地反转。