试图在C 中逆转字符串,但要恢复相同的字符串

Trying to reverse a string in C++ but getting the same string back

本文关键字:字符串 恢复 逆转      更新时间:2023-10-16

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

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