C++ 对带有传递引用参数的函数使用递归?

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,我必须得到一个字符串并用递归将其反转

到目前为止,我已经

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清空时终止?我遇到了无限循环的问题,因为它一直在不停地反转。