在 C++ 中通过递归反转字符串
string reversal via recursion in c++
在网上寻找一些解决方案后,我尝试了我的代码。有一种关于通过递归反转字符串的算法,我尽力根据该算法制作我的代码。
不幸的是,我的代码只交换给定字符串中的第一个和最后一个字符,而不交换第二个字符和倒数第二个字符,依此类推。
任何帮助,将不胜感激
这是我的代码:
string reverse(string s,int length,int start=0){
if (start>=length){
return s;
}
else{
char temp=s[length];
s[length]=s[start];
s[start]=temp;
reverse(s,--length,++start);
}return s;
}
int main(void) {
string a;cout<<"enter a string:";getline(cin,a);
cout<<reverse(a,a.length()-1,0);
}
您需要通过引用传递字符串,而不是在 reverse
函数中通过值传递:
string reverse(string& s,int length,int start=0){
引用起作用的原因是您要反转当前字符串,而不是临时字符串。
正如评论所建议的那样,如果所需的效果是不改变原始字符串,那么执行递归的辅助函数就可以了。
string reverse_helper(string& s,int length,int start)
{
if (start>=length)
return s;
else
{
char temp=s[length];
s[length]=s[start];
s[start]=temp;
reverse_helper(s,--length,++start);
}
return s;
}
string reverse(string str, int length, int start=0)
{
return reverse_helper(str, length, start);
}
辅助函数的实例:http://ideone.com/RzY1Bu
不是 returning s
,它是原始字符串的副本,第一个和最后一个字符被切换,您需要 return 下一次调用 reverse()
:
else{
//...
return reverse( s, --length, ++start );
}
在网上寻找一些解决方案后,我尝试了我的代码。有一种关于通过递归反转字符串的算法,我尽力根据该算法制作我的代码。 不幸的是,我的代码只交换给定字符串中的第一个和最后一个字符,而不交换第二个字符和倒数第二个字符,依此类推。 任何帮助,将不胜感激 这是我的代码:
string reverse(string s,int length,int start=0){
if (start>=length){
return s;
}
else{
char temp=s[length];
s[length]=s[start];
s[start]=temp;
reverse(s,--length,++start);
}return s;
}
int main(void) {
string a;cout<<"enter a string:";getline(cin,a);
cout<<reverse(a,a.length()-1,0);
}
您需要通过引用传递字符串,而不是在 reverse
函数中通过值传递:
string reverse(string& s,int length,int start=0){
引用起作用的原因是您要反转当前字符串,而不是临时字符串。
正如评论所建议的那样,如果所需的效果是不改变原始字符串,那么执行递归的辅助函数就可以了。
string reverse_helper(string& s,int length,int start)
{
if (start>=length)
return s;
else
{
char temp=s[length];
s[length]=s[start];
s[start]=temp;
reverse_helper(s,--length,++start);
}
return s;
}
string reverse(string str, int length, int start=0)
{
return reverse_helper(str, length, start);
}
辅助函数的实例:http://ideone.com/RzY1Bu
不是 returning s
,它是原始字符串的副本,第一个和最后一个字符被切换,您需要 return 下一次调用 reverse()
:
else{
//...
return reverse( s, --length, ++start );
}