当我尝试在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));
}
}
但是为什么我要返回相同的字符串却没有反向?
答案 0 :(得分:8)
您将获得相同的字符串,因为您再次构建了相同的字符串。 以“ ABC”为例,您将看到函数的作用:
reverseit(“ ABC”)返回'A'+ reverseit(“ BC”)
reverseit(“ BC”)返回'B'+ reverseit(“ C”)
reverseit(“ C”)返回'C'
您想要的
char firstChar = input.at(0);
return reverseit(deleteFirstElement(input)) + firstChar;
但是实际上您应该在寻找另一种解决方案。递归
通常应尽可能避免。可以肯定,某些解决方案确实很优雅,但是循环几乎总是更快。
答案 1 :(得分:3)
更改其中的else部分
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);
}
}
答案 2 :(得分:2)
递归不是逆转事情的简单方法。
这是简单的方法:
#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;
}
答案 3 :(得分:1)