C#:递归替换字符串中的字符

C#:递归替换字符串中的字符,c#,string,recursion,C#,String,Recursion,我有一个字符串“abcdef”我想递归更改。如果找到字符cha,则在此之前的所有字符都应替换为另一个字符chb 前任。 如果cha='d',修改后的字符串将变为“xxxxef”(如果chb='x')。 如果cha='g',则不应更改字符串 这就是我尝试过的 string myString = "abcdef"; char[] str = myString.ToCharArray(); void FindInString(int p) { if (p < str.Length-1)

我有一个字符串
“abcdef”
我想递归更改。如果找到字符
cha
,则在此之前的所有字符都应替换为另一个字符
chb
前任。 如果
cha='d'
,修改后的字符串将变为“xxxxef”(如果
chb='x'
)。 如果
cha='g'
,则不应更改字符串

这就是我尝试过的

string myString = "abcdef";
char[] str = myString.ToCharArray();
void FindInString(int p)
{
   if (p < str.Length-1)
   {
      if (str[p] != cha)
         FindInString(p + 1);
   }
   str[p] = chb;
}

我会尽量按照@Mong Zhu的建议更好地解释

1) 识别
cha
在您的
myString

2) 在
cha
-->
stringAfterCha

3) 在
stringAfterCha
-->之前添加正确数量的
chb
,PadLeft方法向字符串添加所需的
chb
(第二个参数)以达到长度(第一个参数)


我假设最简单的方法是:处理字符串中第一次出现的
charcha

关于递归的第一件事:当这个递归调用的字谜必须结束时,要清楚!所以你需要正确的退出策略

string s = "abcdefg";
  • 如果没有匹配的
    cha

    如果(!s.Contains(cha))

  • 如果你找到了你的对手,你就会停下来

    else如果(s[index]==cha)

  • 否则,您将增加索引并重复调用

现在第二件事是
返回值。您的方法应该更改字符串并返回它。因此,让它这样做是很好的。如果将所有必要的参数传递给该方法,它将独立于其范围之外的变量。你需要:

  • 字符串是s
  • 索引位置的索引
  • 和匹配的字符
  • 当然还有拟合的返回值

    publicstaticstringfindinstring(strings,int-index,charcha)

对于字符串操作,
StringBuilder
是一个方便的工具。它允许您在某些位置更改字符,比如在数组中,这在字符串中是不可能的,因为它们是不可变的

StringBuilder sb = new StringBuilder(s);

// change the char at index:
sb[index] = 'x';
现在,最后一步当然是递归调用。基本上,您可以进一步使用索引,并在
return
语句中再次调用该方法

index++;
return FindInString(sb.ToString(), index, cha);
这应该足以使您能够将此方法作为递归版本编写。 如果你仍然需要帮助,写一条评论

编辑:

关于递归性,我不理解的是它在返回的过程中发生了什么


人们试图做的是将整个问题分解成更小的子问题,类似于整个问题的结构。想象一下,在每个递归步骤中,您解决了整个问题的一部分问题,并将部分解决方案留在这一步。当你继续沿着递归的阶梯走下去时,你在每一步都会问“整个问题解决了吗?”如果不重复你自己/问题解决过程。当你走到最后一步,问题的答案是“是”时,当你向后爬返回语句的阶梯时,你会转身向后收集答案。这当然只是一个比喻,但也是说明这个过程的一种方法。

我仍然不认为这是递归的一个好例子,但也许这段代码对您有所帮助。基本上,您必须返回bool,以便调用方法知道是否找到了seached字符。如果已经找到,您将更改正在分析的字符,并将true返回到上一个调用方法。当然,这可能会得到优化,并决定如果存在重复的搜索字符,该怎么办,但这只是一个示例。顺便说一句,我建议你总是一步一步地调试你的代码,这样你就会看到它是如何工作的

static bool FindInString(int p)
{
    char cha = 'd';
    char chb = 'x';
    if (p < str.Length - 1)
    {
        if (str[p] != cha)
        {
            if (FindInString(p + 1))
            {
                str[p] = chb;
                return true;
            }
        }
        else
        {
            str[p] = chb;
            return true;
        }

    }
    return false;
}

为什么需要递归?我只需要使用一个循环…@atlaste听起来像是家庭作业。。。要学习递归,只需编写
,否则如果
正确,那么我的答案是:使用调试器的“单步执行”、“单步执行”功能。如果是学习递归的家庭作业,老师应该当众受到惩罚。我想不出一个最坏的例子了。我在努力学习。除了@Pikoh提出的非常有效的观点之外,这里没有任何描述或解释。。。不是最有用的方法。。
index++;
return FindInString(sb.ToString(), index, cha);
static bool FindInString(int p)
{
    char cha = 'd';
    char chb = 'x';
    if (p < str.Length - 1)
    {
        if (str[p] != cha)
        {
            if (FindInString(p + 1))
            {
                str[p] = chb;
                return true;
            }
        }
        else
        {
            str[p] = chb;
            return true;
        }

    }
    return false;
}
str = myString.ToCharArray();
FindInString(0);