我正在做一些递归练习。前一个是为字符串创建一个reverse()函数,它基本上删除了第一个字符,然后组合了解决方案。我设法做到了,这里是源代码(整个源代码)当前的任务是修改这个函数(书中的下面的练习),添加一个辅助函数来反转字符串的子字符串。此刻我被困在这里。我理解你在需要传递额外的参数或其他东西时使用辅助函数,而这个函数不需要,所以我真的不知道如何处理这个问题。帮助赞赏。
#include <iostream>
#include <string>
using namespace std;
void reverse(string& text)
{
if (text.length() == 0)
{
return;
}
if (text.length() == 1)
{
return;
}
else
{
string firstLetter = text.substr(0,1);
text = text.substr(1, text.length()-1);
reverse(text);
text += firstLetter;
}
}
int main()
{
string a = "tyu";
reverse(a);
cout << a << endl;
return 0;
}
一个人建议使用参数,等等,这是我的尝试:
#include <iostream>
#include <string>
using namespace std;
//is actually doing the hard work
void reverse1(string& input, int a, int b)
{
// base case
if( a >= b)
{
return;
}
//swap the characters
char tmp;
tmp = input[a];
input[a] = input[b];
input[b] = tmp;
//create the boundries for the new substring
a++;
b--;
//call the function again
reverse1(input, a, b);
}
// sets the parameters and calls the helper function
void strreverse(string& input)
{
reverse1(input, 0, input.length()-1);
}
int main()
{
cout << "Please enter the string which you want to be reversed:";
string a;
cin >> a;
strreverse(a);
cout << a << endl;
return 0;
}
答案 0 :(得分:2)
目标可能是避免创建所有中间子串。辅助函数将采用迭代器,或者除了字符串begin reversed之外的起始和结束索引。
答案 1 :(得分:1)
尝试实现反转,以便只有std::string
的一个实例(即与数组一样使用它)。然后你需要一个带有附加参数的辅助函数(至少有一个参数 - 现在要反转的索引)。
我会在这里实现反向作为一系列交换:a [0]&lt; - &gt; a [n-1],a [1]&lt; - &gt; a [n-2]等,其中n是字符串的长度。
答案 2 :(得分:0)
您可以定义一个辅助函数,该函数接受它将反转的子字符串的开始和结束索引。 该函数应该将起始索引处的元素与结束索引IFF处的元素交换起始索引和结束索引之间的差值为1.否则,它通过递减结束索引并递增起始索引来对其自身进行递归调用。如果开始和结束索引变得相同,您将需要检查条件。