【问题标题】:C#: recursively replace characters in a stringC#:递归替换字符串中的字符
【发布时间】:2017-04-24 16:19:48
【问题描述】:

我有一个字符串"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;

【问题讨论】:

  • 为什么需要递归?我会简单地使用一个循环......
  • @atlaste 听起来像家庭作业...学习递归
  • else if
  • 对,在这种情况下,我的答案是:使用调试器“步入”、“跳过”功能。
  • 如果是作业学习递归,老师应该当众处罚。我想不出一个最糟糕的例子

标签: c# string recursion


【解决方案1】:

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

1) 确定cha 在您的myString 中的位置

2) 创建cha之后所有字符的子串 --> stringAfterCha

3) 在stringAfterCha 之前添加正确数量的chb --> 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); 

【讨论】:

  • OP 正在尝试学习一些东西。除了@Pikoh 提出的非常有效的观点之外,这里没有任何描述或解释……这不是最有用的方法……
【解决方案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);

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

编辑:

我对递归的不理解是在它回来的路上发生了什么,

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-27
      • 2011-05-09
      • 2016-04-09
      • 2013-08-21
      • 1970-01-01
      • 2023-03-04
      • 2011-10-20
      • 2014-07-30
      • 1970-01-01
      相关资源
      最近更新 更多