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++:使用递归反转字符串的主要内容,如果未能解决你的问题,请参考以下文章