C++ 反转字符串的递归方法

C++ 反转字符串的递归方法,c++,string,C++,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[

我正在尝试编写一个递归方法来反转字符串,如下所示

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;
}
void reverse(字符串s,int i,int l)
{
静态int j;
while(我不要在函数中使用
while()
循环。此外,如果希望修改字符串,则需要通过引用传递该字符串。这是您的代码,但有一点改进:):

void反向(字符串&s,整数i,整数l)
{
静态int j=0;
如果(icout在您的实现中有几个错误,就像其他答案已经指出的那样,最大的错误是您正在按值传递字符串,因此您正在对原始字符串的副本进行更改,第二个原因是循环不会结束,因为您使用while循环来中断递归,但您只是在执行inc当您递归调用reverse时,请记住“i”,这意味着在第一次调用reverse时,“i”不会递增,因此while只会在递归的最后一次调用时中断,但当它从中返回时,它会被卡在上一次调用中,因为该范围内的“i”永远不会大于“l”。这可以通过更改if指令的while来轻松修复。然后,您的代码将按预期工作

但是,如果要向后打印字符串,则应使用string类上的反向迭代器以相反顺序遍历它,然后只需在运行时打印字符:

for (std::string::reverse_iterator rit = str.rbegin(); rit != str.rend(); ++rit)
    cout << *rit;
for(std::string::reverse_迭代器rit=str.rbegin();rit!=str.rend();++rit)
cout=s.size())
返回;
char ch=s[s.size()-(i+1)];

你可能已经解决了这个问题

另一种方法,如果您不喜欢/不想要迭代器或反向函数

 string revStr(string str){
        if (str.length() <= 1) {
            return str;
        }else{
            return revStr(str.substr(1,str.length()-1)) + str.at(0);
        }
    }
string revStr(string str){

如果(str.length(),我认为使用具有以下签名的递归例程会更幸运
字符串反转(const string s);
并实现我在对Q的评论中描述的算法:


通过使用堆栈并消除i和l参数,反转字符串s与使用第一个字符并预挂起最后(s.length-1)个字符的子字符串的反转相同,直到您(递归地)获取一个长度为1个字符的字符串,这就是字符串本身!

你为i和l传递了什么,为什么j是静态的,为什么有一个“while”循环是否需要递归算法?!一个建议:您可以修改
reverse
函数以返回反转的字符串,而不进行任何打印。使用
if
移除
while
,只在其中包含reverse。您似乎希望
ch
在递归调用后更改。为什么?您的意思是什么通过
rev
j
?+1好吧,我猜你的代码与他/她的原始代码最为相似,并修复了错误。是的,这是我的意图。如果你想从头开始,Prashant Srivastava的解决方案更好:)你为什么要声明我是静态的,我不必通过“I”作为递归函数的参数,它是静态的有什么错吗?我认为你不理解静态的用法,下次你尝试反转字符串时,函数将具有上次调用的I值。哦,你是对的,没有想过它会被多次调用。
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 revStr(string str){
        if (str.length() <= 1) {
            return str;
        }else{
            return revStr(str.substr(1,str.length()-1)) + str.at(0);
        }
    }