反转字符串的递归方法
Recursive method of reversing string
我正试图编写一个递归方法来反转字符串,如下所示。
void reverse(string s,int i,int l)
{
static int j;
while(i<l)
{
char ch=s[i];
cout<<ch<<endl;
reverse(s,i+1,l);
cout<<"after="<<ch<<endl;
s[j]=ch;
j++;
}
cout<<s<<endl;
s[j]=0;
}
但是我的输出不正确。"after="<<ch
总是打印字符串的最后一个字符。函数的参数是s是std::string,i是从0开始的索引,l是字符串的长度。任何人都能指出我做错了什么吗。
您可能已经解决了这个问题。
另一种方法,如果您不喜欢/想要迭代器或反向函数。
string revStr(string str){
if (str.length() <= 1) {
return str;
}else{
return revStr(str.substr(1,str.length()-1)) + str.at(0);
}
}
不要在函数内部使用while()
循环。此外,如果希望修改字符串,则需要通过引用传递字符串。这是你的代码,有一点改进:):
void reverse(string& s,int i,int l)
{
static int j = 0;
if (i < l)
{
char ch=s[i];
cout<<ch<<endl;
reverse(s,i+1,l);
cout<<"after="<<ch<<endl;
s[j]=ch;
j++;
}
cout<<s<<endl;
}
在您的实现中有几个错误,就像其他答案已经指出的那样,最大的错误是您按值传递字符串,所以您对原始字符串的副本进行了更改,其次,循环不会结束的原因是您使用while循环来打破递归,但是当你递归调用reverse时,你只会增加"i",这意味着在第一次调用reverse时,"i"不会增加,所以while只会在递归的最后一次调用时中断,但当它从中返回时,它会停留在前一次调用中,因为该范围中的"i"永远不会大于"l"。可以通过更改if指令的while来轻松修复。然后您的代码将按预期工作。
然而,如果你想向后打印字符串,你应该在字符串类上使用反向迭代器以相反的顺序遍历它,然后边打印边打印字符:
for (std::string::reverse_iterator rit = str.rbegin(); rit != str.rend(); ++rit)
cout << *rit;
如果你使用C++和字符串类,你应该利用它强大的功能。
如果你只是在做一个递归练习,我不太明白你到底想完成什么,但如果我用递归向后写一个字符串,我会做这样的事情:
void reverse(string& s, int i = 0)
{
// Break the recursion.
if(i >= s.size())
return;
char ch = s[s.size() - (i + 1)];
cout<< ch << endl;
++i;
reverse(s, i);
}
我认为递归例程的签名如下string reverse(const string s);
和实现我在对Q:的评论中描述的算法
通过使用堆栈,并消除i和l参数,反转字符串s与获取第一个字符和预挂起最后(s.length-1)个字符的子字符串的反转相同,直到(递归)获得长度为1个字符的字符串,即字符串本身
- C++:正在检查LinkedList中的回文-递归方法-错误
- 数组元素打印的递归方法
- 递归形成字符串中所有数字字符的中间和?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- 在c++中使用递归从字符串中删除所有辅音
- 我对 leetcode 72 上的递归方法感到茫然
- 使用递归方法遇到分段错误
- 我的链接列表反向递归方法的代码的问题是什么?
- 在链接列表中找到值的递归方法
- C++:使用递归反转字符串
- 使用不带 or 循环的递归反转字符串<algorithm>
- 我应该如何实现递归方法以找到在C++中形成最大堆的多种方法
- 使用递归方法将矢量作为输入时进行分割故障
- 使用递归方法的类,使用int矢量元素作为输入
- 如何使用递归向字符串添加逗号
- 3D 迷宫递归方法 - C++
- 为什么将十进制转换为二进制的递归方法比迭代、使用和返回字符串更快
- 反转字符串的递归方法
- 如何替换字符串中的某个字符?最好是递归方法