我有一个字符串"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;
答案 0 :(得分:2)
我假设最简单的方法:你想要解决字符串中char cha
的第一次出现。
关于递归的第一件事:当这个递归 - 调用 - 游戏必须结束时要清楚!所以你需要正确的退出策略。
string s = "abcdefg";
如果cha
if (!s.Contains(cha))
如果找到了匹配,你就会停止
else if (s[index] == cha)
否则你会增加索引并重复调用
现在第二件事是return
值。您的方法应该更改字符串并返回它。所以让它这样做会很好。如果将所有必需参数传递给方法,它将独立于其范围之外的变量。你需要:
当然还有拟合返回值
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);