【问题标题】:My recursive function to reverse the chars of a string does not work我用于反转字符串字符的递归函数不起作用
【发布时间】:2022-11-06 04:09:42
【问题描述】:

我试图为同一个问题创建不同的递归函数,即反转一个单词的字母。虽然我所有使用 void 返回类型的解决方案(我只是反向打印字母)都有效,但我一直在尝试使用字符串返回类型来制作一个,但遇到了问题。当输入你好,下面的代码给我l。而且我似乎无法弄清楚为什么......

string reverse(string s)
{
    int len = s.length();
    if (len <= 1)
    {
        return s;
    }
    swap(s[0], s[len-1]);
    return reverse(s.substr(1, len-2));
}

【问题讨论】:

    标签: c++ string recursion function-definition


    【解决方案1】:

    您每次都使用子字符串调用您的函数,并且只返回最后一个字符。在较低的返回语句( return reverse(s.substr(1, len-2)); )中,您还需要包含第一个和最后一个字符。

    就像是: 返回 s[0] + reverse(s.substr(1,len-2)) + s[len-1];

    【讨论】:

    【解决方案2】:

    “你好”这个词有奇数个字母。因此,由于这个 if 语句,函数的最后一次递归调用返回字母 'l'

    if (len <= 1)
    {
        return s;
    }
    

    这是函数的所有递归调用的返回值。

    你至少应该像这样写

    string reverse(string s)
    {
        auto len = s.length();
        if (len <= 1)
        {
            return s;
        }
        swap(s[0], s[len-1]);
        return s[0] + reverse(s.substr(1, len-2)) + s[len-1];
    }
    

    实际上使用函数swap是多余的。你可以写

    string reverse(string s)
    {
        return s.length() < 2 ? s 
                              : s[s.length() - 1] + reverse( s.substr( 1, s.length() - 2 ) ) + s[0];
    }
    

    如果没有递归,该函数可以通过以下方式查看

    string reverse( const string &s )
    {
        return { s.rbegin(), s.rend() };
    }
    

    【讨论】:

      【解决方案3】:

      使用此代码来获得一些正确的逻辑。我将字符串及其第 0 个索引及其最后一个索引作为参数传递。然后只需使用交换技术并进行递归调用。为了更好地理解,我建议调试代码并观察每一次迭代。

      #include <iostream>
      using namespace std;
      
      string reverse(string str, int i, int j)
      {
          if (i >= j)
              return str;
          char temp = str[i];
          str[i] = str[j];
          str[j] = temp;
          return reverse(str, i + 1, j - 1);
      }
      
      int main()
      {
          string str = "Hello";
          cout << "Reverse string is: " << reverse(str, 0, str.length() - 1);
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-03-26
        • 2013-02-25
        • 2020-07-27
        • 2022-01-09
        • 1970-01-01
        • 2017-07-20
        • 1970-01-01
        相关资源
        最近更新 更多