尝试在C ++中反转字符串,但返回相同的字符串

时间:2019-03-07 12:22:08

标签: c++ algorithm sorting reverse

当我尝试在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));
    }
}

但是为什么我要返回相同的字符串却没有反向?

4 个答案:

答案 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)

如果您有,则此问题基本上可以归结为:

string reverseit(string input) {
  string result(input);
  boost::range::reverse(result);
  return result;
}

如果没有,则可以改用:

std::reverse(result.begin(), result.end());

如前所述,递归降低了程序的可读性,应该保留给极少数情况(通常是其他解决方案更加复杂的情况)。