C++ 递归:将字符串中的e替换为a
我的问题是,我需要对一个字符串进行递归,并将任何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 {
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
语句都将返回一个字符串;您可能想将当前结果添加到递归调用的结果中,从而逐个字符构建最终输出。