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

时间:2016-12-09 08:30:59

标签: 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)
   {
      if (str[p] != cha)
         FindInString(p + 1);
   }
   str[p] = chb;
}

对于递归性我不了解的是它在回归的过程中发生的事情,即。如何为行写一个条件

str[p] = chb;

3 个答案:

答案 0 :(得分:2)

我假设最简单的方法:你想要解决字符串中char cha的第一次出现。

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

string s = "abcdefg";
  • 如果cha

    不匹配,您就会停止

    if (!s.Contains(cha))

  • 如果找到了匹配,你就会停止

    else if (s[index] == cha)

  • 否则你会增加索引并重复调用

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

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

    public static string FindInString(string s, int index, char cha)

对于字符串操作,StringBuilder是一种方便的工具。它允许你在某些位置更改字符,就像数组中的字符串一样,因为它们是不可变的。

StringBuilder sb = new StringBuilder(s);

// change the char at index:
sb[index] = 'x';

现在最后一步当然是递归调用。您基本上更进一步使用索引并return语句中再次调用该方法

index++;
return FindInString(sb.ToString(), index, cha);

这应该足以让您将此方法编写为递归版本。 如果您仍需要帮助,请写评论。

编辑:

  

关于递归性我不明白的是它正在发生的事情,

试图做的是将整个问题分解为类似于整个问题结构的较小子问题。想象一下,在每个递归步骤中,您解决了整个问题的部分问题,并在此步骤中保留部分解决方案。当你一直走下楼梯时,你会在每一步都问“整个问题是解决了吗?”如果不重复自己/解决问题的程序。当你到达最后一步并且回答是肯定的问题时,当你向后爬楼梯时,你会转身并向后收集解决方案。这当然只是隐喻,而是说明这一过程的一种方式。

答案 1 :(得分:0)

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

1)确定cha

myString的位置

2)在cha - &gt;之后创建所有角色的子串。 stringAfterCha

3)在chb - &gt;之前添加正确数量的stringAfterCha PadLeft方法添加到您的字符串中,需要chb(第二个参数)才能达到长度(第一个参数)

var cha = 'd';
var chb = 'x';
var myString = "abcdef";
int positionOfChaInMyString = myString.IndexOf(cha) + 1;
string stringAfterCha = myString.Substring(positionOfChaInMyString);
string result = stringAfterCha.PadLeft(myString.Length, chb); 

答案 2 :(得分:0)

我仍然不认为这是递归的一个很好的例子,但也许这段代码可以帮助你。基本上,您必须为调用方法返回一个bool,以了解是否已找到已搜索的字符。如果已找到,则更改正在分析的字符并返回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;
}

示例电话:

str = myString.ToCharArray();
FindInString(0);