Нахождение длины слова в начале строки с рекурсией - PullRequest
0 голосов
/ 15 ноября 2009

Я написал код ниже, чтобы вычислить длину слова в начале строки с рекурсией. Я подумал о случае, когда мой код не будет работать "# @ * привет", что мне нужно изменить код для решения этой проблемы (правильный ответ 5)? Спасибо

   int startWordLenRec(char s[]) {
        int length;
        if (isLetter(s[0]) == false){
            return 0;
        }
        else{
            length = 1 + startWordLenRec(s+1);
        }
        return length;
    }

Ответы [ 2 ]

3 голосов
/ 15 ноября 2009

Немного неясно, почему вы используете рекурсию за пределами функционального языка для решения этой проблемы. Также, честно говоря, немного неясно, каковы реальные параметры проблемы.

Если вы хотите измерить длину первого слова в строке (определяется как последовательность символов, которые возвращают результат True при передаче в isLetter), даже если это слово не начинается с начала строки, тогда самое простое и ясное решение выглядит так: заставить функцию принять флаг в качестве аргумента, который называется letterSeenYet. При первоначальном вызове функции флаг должен быть установлен на False.

  • Если функция читает не буквенный символ, а флаг letterSeenYet равен False, установите length равным 0 + результаты рекурсивного вызова функции и убедитесь, что установлен флаг этого вызова до False.
  • Если функция читает буквенный символ, установите length равным 1 + результаты рекурсивного вызова функции и убедитесь, что флаг этого вызова установлен на True.
  • Если функция читает не буквенный символ, а флаг letterSeenYet равен True, вернуть 0.

Надеюсь, вы понимаете логику: вы хотите, чтобы небуквенный символ означал «перестать считать буквы», но только после того, как вы увидели некоторые буквы для начала.

Опять же, я действительно не понимаю, почему вы используете рекурсию для этой проблемы. Есть некоторые проблемы, которые легче понять в их рекурсивной форме, но эта проблема кажется намного, намного проще (и более эффективной), чтобы решить итеративно. (Также, как указывает Чарльз Сальвия, вы должны быть готовы не только к концу первого слова, но и к возможному концу строки.)

0 голосов
/ 15 ноября 2009

Мышление с точки зрения рекурсии может быть немного сложным. Не вдаваясь в детали того, почему или почему не следует использовать рекурсию, давайте предположим, что это должна быть рекурсия (домашняя работа, открытие, независимо от причины).

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

В этом случае вам нужно определить, когда заканчивается массив символов. Это будет иметь место, если текущий символ '\0'.

Простой рекурсивный алгоритм может быть:

  • Проверить текущий символ. Это '\ 0'?
    • Да: Возврат 0
    • Нет. Является ли текущий символ буквой?
      • Да: вернуть 1 + вызвать эту функцию с увеличенным символьным указателем
      • Нет: вернуть 0 + вызвать эту функцию с увеличенным символьным указателем

Обратите внимание, что этот алгоритм не прекратит работу после того, как увидит не буквенный символ, поэтому "test a" вернет 5, а не 4. Если вам нужно завершить раньше, вам понадобится флаг какого-то типа, который передается в функция.

В любом случае, я хотел подумать о том, каким должно быть условие завершения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...