C++:使用递归反转字符串

Posted

技术标签:

【中文标题】C++:使用递归反转字符串【英文标题】:C++: Reverse a string using recursion 【发布时间】:2019-03-18 01:59:11 【问题描述】:

我正在尝试通过反转来修改通过引用传递它的字符串 例如:word dolphin 表示它是仅使用递归的 nihplod。 我无法向修改其标题的功能添加更多参数。 我现在的输出是 od 而不是 dolphin,我认为它只做最后两个字母,老实说我不知道​​为什么。有什么我应该改变的吗?这是我的代码。

void reverse(string &word) 
    if (word.length() == 1 || word.length() == 0) 
        if (word.length() == 1) 
            word = word;
        
        else if (word.length() == 0) 
            word = "nothing to reverse";
        
    
    else 
        string temp;
        if (temp.length() == 0) 
            temp = "";
            temp = temp+word.substr(word.length() - 1, 1);
            word.pop_back();
            if (word.length() == 0) 
                word = temp;
            
            else if (word.length() == 1) 
                //temp = temp + word.substr(word.length() - 1, 1);
                temp = temp + word;
                word.pop_back();
                word = temp;
            
            else 
                reverse(word);
            
        
        else 
            temp = temp + word.substr(word.length() - 1, 1);
            word.pop_back();
            if (word.length() == 0) 
                word = temp;
            
            else if (word.length() == 1) 
                //temp = temp + word.substr(word.length() - 1, 1);
                temp = temp + word;
                word.pop_back();
                word = temp;
            
            else 
                reverse(temp);
            

        
    



【问题讨论】:

你有没有用铅笔和纸逐步完成你的逻辑?并将其与使用调试器执行程序进行比较?然后你应该找到变量和代码流分歧的地方,你就会知道错误在哪里,不是吗? 为什么需要递归? C++ reverse string recursion的可能重复 您还应该清理您的代码:例如,if (temp.length() == 0)else 端永远不会执行。此外,当您编写递归函数时,您应该让基本情况(非递归情况)进行检查 - 如果您的基本情况和递归中的字长为 0 或 1,则基本上有重复的代码检查案例,如果你巧妙地编写基本案例,你可以直接调用reverse(word)而不用担心字长。 @NiayeshIsky 谢谢你的教程,它解释得更好更详细! 【参考方案1】:

算法是这样的:

如果字符串长度小于2,直接返回 去掉单词的第一个和最后一个字符以创建一个子字符串 在您的子字符串上递归调用reverse 从递归返回后,在原来的“last char”前缀和原来的“first char”后缀完成字符串

给你:

void reverse(string& word)

    size_t len = word.size();

    if (len < 2)
    
        return;
    

    char first = word[0];
    char last = word[len - 1];
    string inner;

    if (len > 2)
    
        inner = word.substr(1, len - 2);
        reverse(inner);
    
    word = last + inner + first;

【讨论】:

非常感谢!这更有意义,而且比我的解决方案短得多,而且我刚刚意识到 .size() 和 .length() 是同一件事,所以也谢谢你!【参考方案2】:

实现相同目的的非递归方式可能是:

void reverseString(std::string& input)

    const size_t inputStringLength = input.size();
    for (size_t index = 0; index < inputStringLength/2; ++index)
    
        // swap the character at "index" position with the character at "inputStringLength - index - 1" position
        input[index] ^= input[inputStringLength - index - 1] ^= input[index] ^= input[inputStringLength - index - 1];
    

【讨论】:

【参考方案3】:
void rev_recv(std::string& s, int from, int to) 
    if (from >= to) return;
    rev_recv(s, from + 1, to - 1);
    std::swap(s[from], s[to]);

【讨论】:

【参考方案4】:
void reverse(string &word) 

    string temp = word;
    if(temp.length != 0)
    
       cout << temp.at(temp.length()-1);
       reverse(temp.erase(temp.length()-1));
    
    else
       cout << "\ndone\n";

这将反向打印并且不会修改传入的原始字符串。 如果要修改原始字符串,只需删除 temp 变量即可。

【讨论】:

实际上,您的代码有两个问题:1) temp.length 需要括号才能使其成为函数调用。 2) 删除temp 变量将修改原始字符串,但它只会将其清空,而不是将反转的字符串存储在其中(参见this test code)。 是的,在我发布此代码后,我意识到他想将原件修改为反转。是的,我确实意识到它会清空它

以上是关于C++:使用递归反转字符串的主要内容,如果未能解决你的问题,请参考以下文章

我想反转堆栈,但我不知道如何使用递归来反转这个......如何在不使用递归的情况下反转堆栈

在Java中递归反转字符串的最佳方法是啥?

如何使用递归反转字符串?

递归:反转字符串

递归:反转字符串

递归字符串反转函数