试图在C 中逆转字符串,但要恢复相同的字符串
Trying to reverse a string in C++ but getting the same string back
当我尝试在C 中反转时,我会恢复相同的字符串。
我读到递归是逆转事物的好方法。我试图通过返回字符串的第一个字符并调用相同功能的第一个字符,直到字符串的大小为1来实现递归算法。:
string deleteFirstElement(string input) {
if (input.size() == 1) {
return input;
}
// This loop brings the first element to the last position
for (int i = 0; i < input.size()-1; i++) {
char temp;
temp = input.at(i);
input.at(i) = input.at(i+1);
input.at(i + 1) = temp;
}
input.pop_back(); // Delete last element of the string
return input;
}
string reverseit(string input) {
if (input.size() == 1) {
return input;
}
else {
return input.at(0) + reverseit(deleteFirstElement(input));
}
}
但是为什么我要回去相同的字符串而没有反向?
您会恢复相同的字符串,因为您再次构建同一字符串。使用" ABC"的示例,您将看到该函数的作用:
reverseIt(" abc")返回'a'a' reverseit(" bc")
逆向(" bc")返回'b' reverseit(" c")
逆向(" C")返回'c'
您想要
char firstChar = input.at(0);
return reverseit(deleteFirstElement(input)) + firstChar;
但实际上您应该研究另一个解决方案。递归
- 降低可读性
- 很慢
- 使用大量堆栈内存
- 很容易创建难以调试无尽的循环
通常,如果可能的话,应该避免使用。可以肯定的是,某些解决方案确实很优雅,但是循环几乎总是更快。
将其他部分从此
更改 string reverseit(string input) {
if (input.size() == 1) {
return input;
}
else {
return input.at(0) + reverseit(deleteFirstElement(input));
}
}
到这个
string reverseit(string input) {
if (input.size() == 1) {
return input;
}
else {
return reverseit(deleteFirstElement(input))+ input.at(0);
}
}
递归不是逆转事物的简单方法。
这是简单的方法:
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s { "hello" };
reverse(s.begin(), s.end());
cout << s << endl;
}
这是一个恢复解决方案。它起作用,但较不合理和高效。
#include <iostream>
#include <string>
using namespace std;
string recursiveReverse(string value, string accum = "")
{
if(value.size() == 0)
{
return accum;
}
else
{
accum += value.back();
value.pop_back();
return recursiveReverse(value, accum);
}
}
int main()
{
string s { "hello" };
s = recursiveReverse(s);
cout << s << endl;
}
如果您有提升,此问题基本上归结为:
string reverseit(string input) {
string result(input);
boost::range::reverse(result);
return result;
}
没有提升,您可以使用:
std::reverse(result.begin(), result.end());
如前所述,递归降低了您的程序的可读性,应保留给极少数情况(通常是另一个解决方案更复杂)。