C++ 递归:将字符串中的e替换为a

C++ 递归:将字符串中的e替换为a,c++,string,recursion,C++,String,Recursion,我的问题是,我需要对一个字符串进行递归,并将任何e更改为a。每次我输入一个单词,它只打印出最后一个字母 到目前为止,我的代码是: string ReplaceEsWithAs(string s) { if (s.length() == 1) { if (s == "e") { s = "a"; return s; } else {

我的问题是,我需要对一个字符串进行递归,并将任何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));
    }
}

函数中只有
return
语句处于该状态

if (s.length() == 1)
函数return总是返回一个包含一个字符的字符串,这是有道理的

在递归部分中,您使用:

return ReplaceEsWithAs(s.substr(1));
它使用字符串的第一个字符以外的所有字符调用函数

如果您在
main
中使用“abcd”进行调用,则在递归调用中使用“bcd”进行调用,然后使用“cd”进行调用,然后使用“d”进行调用,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));
}

下面是一个通过循环并改变字符串的实现:

string ReplaceEsWithAs(string s) {
    for (size_t i = 0; i < s.length(); i++) {
        if (s[i] == 'e') {
            s[i] = 'a';
        }
    }
    return s;
}
string replaceswithas(字符串s){
对于(大小i=0;i
您可以使用
[]
通过索引访问字符串中的单个
字符。此代码使用标准的
for
循环遍历每个字符。(
size\u t
是一种无符号整数类型,通常用于索引。)对于每个
char
s[i]
,它检查它是否为
'e'
,如果是,则将其设置为
'a'
。然后它只返回更改后的字符串

这比递归方法好,因为

  • 一目了然更容易理解
  • 它在适当的位置修改字符串,这意味着它不必执行不必要的
    substr
    ing和concatenating(
    +
  • 它使用更少的内存
  • 它不会导致长输入字符串的调用堆栈溢出

此外,标准库还提供了一个函数来执行这样的替换操作。请参阅。

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