【问题标题】:Finding a character in a string through recursion通过递归查找字符串中的字符
【发布时间】:2021-09-20 21:48:14
【问题描述】:

所以,我是编程的超级新手,我需要实现一个方法,通过递归和返回这个 char 的索引,在字符串中找到一个 char,但是如果这个 char 不存在,它返回 -1。而且我不明白我怎么能做到这一点。我需要不进行递增。当我调用递归时,我可能不会加 1,但是如何在不创建“int index”的情况下返回找到的元素的索引。你能让我专注于正确的想法吗? enter image description here

附:据我了解,我是一步一步跳出递归,每次加1,但是值-1如何立即退出呢?

【问题讨论】:

  • 递归调用该方法,检查结果是否为-1,那么你也返回-1,否则你得到的结果加1并返回。
  • 你试过什么?你的代码在哪里?尝试在“调试模式”下运行代码并在多个位置添加断点。然后跟踪您的代码以检查发生了什么。一定会有所帮助
  • 我做到了。我的问题是在“return -1”返回到“1 + 方法调用”位置之后,直到堆栈为空(据我所知)它被执行,而不是 -1 我得到 50
  • "P.S.据我了解,我是一步一步跳出递归的,每次加1,但是如何立即退出,值为-1呢?"如果你真的想有创意,你可以抛出一个异常,它仍然会通过调用堆栈,但它会起作用。将此视为一个有趣的想法,而不是在实际项目中实际完成的事情。

标签: c# recursion


【解决方案1】:

试试下面的:

public int FindChar(char c, string s, index = 0)
{
  if(index >= s.Length)
  {
     return -1;
  }
  if(s[index] == c)
  {
    return index;
  }

  return FindChar(c, s, index + 1);
  
}

【讨论】:

    【解决方案2】:

    有多种方法可以解决这个问题,您很可能需要出现的第一个索引。

    您可以使用startAt 来提供当前位置和增量。

    int FindIndex(string value, char item, int startAt = 0)
        => startAt >= value.length
            ? -1
            : value[startAt] == item
            ? startAt
            : FindIndex(value, item, startAt + 1);
    

    您可以重载此方法并提供一个仅接受 value 和 item 参数而没有任何 startAt 参数的公共方法,并将调用转发给执行此操作的方法。由于这被标记为 C#,因此您需要在一个类中声明这些方法,这意味着其中一个可以是 public,而另一个可以是 private。

    int FindIndex(string value, char item)
        => FindIndex(value, item, 0);
    
    int FindIndex(string value, char item, int startAt)
        => startAt >= value.length
            ? -1
            : value[startAt] == item
            ? startAt
            : FindIndex(value, item, startAt + 1);
    

    你可以从字符串的末尾开始检查。

    int FindIndex(string value, char item)
        => value.Length == 0
        ? -1
        : value[value.Length - 1] == item
        ? value.Length - 1
        : FindIndex(value.Substring(0, value.Length - 1), item);
    

    一个更直接的方法是在您没有找到任何东西时覆盖-1。通过多次递归调用。

    int FindIndex(string value, char item)
        => value.Length == 0
        ? -1
        : value[value.Length - 1] == item
        ? value.Length - 1
        : FindIndex(value.Substring(1), item) == -1
        ? -1
        : 1 + FindIndex(value.Substring(1), item);
    

    或者只是存储结果而不是调用两次。

    int FindIndex(string value, char item)
    {
        if (value.Length == 0)
            return -1;
        else if (value[0] == item)
            return 0;
        else
        {
            var result = FindIndex(value.Substring(1), item);
            if (result == -1)
                return -1;
            else
                return result + 1;
        }
    }
    

    【讨论】:

      【解决方案3】:

      您不会“立即退出”递归。 而且您不应该返回“1 + 方法调用”。 相反,调用该方法,将结果放入一个整数变量中,然后检查结果。 如果结果为 -1,则返回 -1。 否则,返回 1 + 结果。

      【讨论】:

        猜你喜欢
        • 2016-10-02
        • 2014-02-19
        • 2014-05-16
        • 2017-06-13
        • 2015-05-13
        • 2016-01-27
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多