反转字符串的递归方法

Recursive method of reversing string

本文关键字:递归方法 字符串      更新时间:2023-10-16

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

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个字符的字符串,即字符串本身