【问题标题】:My recursive function to reverse the chars of a string does not work我用于反转字符串字符的递归函数不起作用
【发布时间】:2022-11-06 04:09:42
【问题描述】:
我试图为同一个问题创建不同的递归函数,即反转一个单词的字母。虽然我所有使用 void 返回类型的解决方案(我只是反向打印字母)都有效,但我一直在尝试使用字符串返回类型来制作一个,但遇到了问题。当输入你好,下面的代码给我l。而且我似乎无法弄清楚为什么......
string reverse(string s)
{
int len = s.length();
if (len <= 1)
{
return s;
}
swap(s[0], s[len-1]);
return reverse(s.substr(1, len-2));
}
【问题讨论】:
标签:
c++
string
recursion
function-definition
【解决方案1】:
您每次都使用子字符串调用您的函数,并且只返回最后一个字符。在较低的返回语句( return reverse(s.substr(1, len-2)); )中,您还需要包含第一个和最后一个字符。
就像是:
返回 s[0] + reverse(s.substr(1,len-2)) + s[len-1];
【解决方案2】:
“你好”这个词有奇数个字母。因此,由于这个 if 语句,函数的最后一次递归调用返回字母 'l'
if (len <= 1)
{
return s;
}
这是函数的所有递归调用的返回值。
你至少应该像这样写
string reverse(string s)
{
auto len = s.length();
if (len <= 1)
{
return s;
}
swap(s[0], s[len-1]);
return s[0] + reverse(s.substr(1, len-2)) + s[len-1];
}
实际上使用函数swap是多余的。你可以写
string reverse(string s)
{
return s.length() < 2 ? s
: s[s.length() - 1] + reverse( s.substr( 1, s.length() - 2 ) ) + s[0];
}
如果没有递归,该函数可以通过以下方式查看
string reverse( const string &s )
{
return { s.rbegin(), s.rend() };
}
【解决方案3】:
使用此代码来获得一些正确的逻辑。我将字符串及其第 0 个索引及其最后一个索引作为参数传递。然后只需使用交换技术并进行递归调用。为了更好地理解,我建议调试代码并观察每一次迭代。
#include <iostream>
using namespace std;
string reverse(string str, int i, int j)
{
if (i >= j)
return str;
char temp = str[i];
str[i] = str[j];
str[j] = temp;
return reverse(str, i + 1, j - 1);
}
int main()
{
string str = "Hello";
cout << "Reverse string is: " << reverse(str, 0, str.length() - 1);
return 0;
}