Итак, я новичок в программировании, и мне нужно реализовать метод, который находит символ в строке ТОЧНО через рекурсию и возвращает индекс этого символа, но если этот символ не существует, он возвращает -1. И я не понимаю, как я могу это вернуться. Мне нужно, чтобы приращение не производилось. Я не могу добавить 1, когда вызываю рекурсию, но как тогда я могу вернуть индекс найденного элемента без создания «int index». Можете ли вы сосредоточить меня на правильных мыслях? введите здесь описание изображения

P.S. Насколько я понимаю, я выхожу из рекурсии шаг за шагом, добавляя каждый раз 1, но как мне сразу выйти со значением -1?

0
DaRy 11 Июл 2021 в 13:22

3 ответа

Лучший ответ

Есть несколько способов решить эту проблему, вам, скорее всего, понадобится первый индекс вхождения.

Вы можете использовать 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;
    }
}
0
Andrei15193 11 Июл 2021 в 11:26

Вы не «немедленно выходите» из рекурсии. И не нужно возвращать «вызов метода 1 +». Вместо этого вызовите метод, передайте результат в целочисленную переменную и проверьте результат. Если результат -1, верните -1. В противном случае вернуть результат 1 +.

0
Udi Y 11 Июл 2021 в 11:26

Попробуйте следующее:

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);
  
}
0
Pramod Narayan 11 Июл 2021 в 11:27