0

I am trying to write a recursive method of reversing the string as below.

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;
}

But my output is not correct. "after="<<ch is always printing last character of the string. Argument of the function is s is std::string, i is index starting from 0, and l is the length of the string. can any one point out where I am doing wrong thing.

4

4 回答 4

5

您可能已经发现了问题所在。

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

 string revStr(string str){
        if (str.length() <= 1) {
            return str;
        }else{
            return revStr(str.substr(1,str.length()-1)) + str.at(0);
        }
    }
于 2013-07-24T05:08:05.740 回答
1

就像其他答案已经指出的那样,您的实现中有几个错误,最大的一个是您按值传递字符串,因此您正在对原始字符串的副本进行更改,其次是循环不会结束的原因是因为您正在使用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++ 和 string 类,则应该使用它的强大功能来发挥自己的优势。

如果你只是在做一个递归练习,我不太明白你想要完成什么,但是如果我要使用递归向后写一个字符串,我会做这样的事情:

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);
}
于 2013-07-24T05:05:32.393 回答
1

不要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;
}
于 2013-07-24T04:53:14.810 回答
0

string reverse(const string s);我认为使用具有类似签名并实现我在对 Q 的评论中描述的算法的递归例程会有更好的运气 :

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

于 2013-07-24T05:10:48.860 回答