【问题标题】:Recursion: swapping an e for an a in a string递归:将字符串中的 e 替换为 a
【发布时间】:2017-01-30 11:57:24
【问题描述】:

我的问题是我需要对字符串进行递归并将任何 e 更改为 a。每次我输入一个单词时,它只会打印出最后一个字母。

到目前为止我的代码:

string ReplaceEsWithAs(string s)
{
    if (s.length() == 1)
    {
        if (s == "e")
        {
            s = "a";

            return s;
        }

        else
        {
            return s;
        }
    }

    else
    {
        return ReplaceEsWithAs(s.substr(1));
    }
}

【问题讨论】:

  • 使用适当的缩进格式化代码总是有帮助的。
  • 对不起,我对此完全陌生,我会修复它。
  • 我认为通过循环(并可能修改)字符串中的每个字符而不是递归来更好地解决这个问题。
  • 是的,我可以在没有递归的情况下做到这一点,但我想知道为什么它只打印出单词的最后一个字母。我不知道这是否是我的 if 语句,因为我尝试了不同的方法来修复它,但它仍然不起作用。
  • 试着写出程序流程图。您拥有的每个return 语句都将返回一个单字符串;您可能的意思是将当前结果添加到递归调用的结果中,从而逐个字符地构建最终输出。

标签: c++ string recursion


【解决方案1】:

函数中仅有的return语句在条件下

if (s.length() == 1)

函数 return 总是返回一个包含一个字符的字符串是有道理的。

在递归部分,你使用:

return ReplaceEsWithAs(s.substr(1));

它使用字符串的第一个字符以外的所有字符调用函数。

如果你从main用“abcd”调用,你在递归调用中用“bcd”调用,然后用“cd”调用,然后用“d”调用,它返回“d”,即一路返回。

您只是在每次递归调用中丢弃第一个字符。

你需要使用:

string ReplaceEsWithAs(string s)
{
   if (s.length() == 1)
   {
      if (s == "e")
      {
         return "a";
      }

      // No need for an else
      return s;
   }

   //  No need for an else.
   return ReplaceEsWithAs(s.substr(0,1)) + ReplaceEsWithAs(s.substr(1));
}

【讨论】:

    【解决方案2】:

    这是一个通过循环和改变字符串的实现:

    string ReplaceEsWithAs(string s) {
        for (size_t i = 0; i < s.length(); i++) {
            if (s[i] == 'e') {
                s[i] = 'a';
            }
        }
        return s;
    }
    

    您可以使用[] 按索引访问字符串中的单个chars。此代码使用标准的for 循环来遍历每个字符。 (size_t 是一个无符号整数类型,通常用于索引。)对于每个char s[i],它会检查它是否为'e',如果是,则将其设置为'a'。然后它只返回更改后的字符串。

    这比递归方法更好,因为

    • 一目了然更容易理解
    • 它就地修改字符串,这意味着它不必做不必要的substring 和连接 (+)
    • 它使用更少的内存
    • 长输入字符串不会导致调用栈溢出

    此外,标准库提供了一个函数来执行这样的替换操作。见this answer

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 2011-09-27
      • 1970-01-01
      • 2011-05-09
      • 2013-08-21
      • 2023-03-04
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多