#java #recursion
#Ява #рекурсия
Вопрос:
Я изучаю рекурсию для своего вводного урока информатики, и я действительно борюсь с ее применением. Если у меня есть какой-то метод, подобный этому:
public static String buildString(String str) { ... return ...; }
Как бы я мог создать и вернуть копию строки в прототипе, рекурсивно вызвав buildString без использования итератора? Я много раз пытался использовать подстроку, но продолжал получать ошибки stackoverflow.
Отказ от ответственности: Это не является частью домашнего задания или чего-то в этом роде. Это гипотетический метод, который я придумал.
Комментарии:
1. Объясните, чего вы пытаетесь достичь в этом конкретном случае. Это может быть случай, когда рекурсия используется по неправильной причине.
2. Я пытаюсь создать метод, который создает копию строки в прототипе (в данном случае str), рекурсивно вызывая buildString без использования итератора. Я знаю, что есть более простые способы сделать это, но я хочу знать, как это сделать с целью изучения рекурсии.
3. В том-то и дело, что это не лучший вариант использования рекурсии. Почему бы вам не попробовать более классический пример, такой как Фибоначчи?
4. Вы говорите, что пробовали что-то, но не показываете, что пробовали. Если метод состоит в том, чтобы сделать копию строки (которая неизменна), почему он не мог просто вернуть строку? Или
return str.substring(0, str.length());
? В чем здесь был бы смысл рекурсии? Копировать строку по одному символу за раз?5. Да, чтобы копировать строку по одному символу за раз. Наверное, мне следовало это уточнить.
Ответ №1:
- Укажите условие выхода: если входная строка пуста, верните пустую строку.
Использовать методыString::isEmpty
илиString::length
- Вызов
buildString
рекурсивно с использованием подстроки и добавлением символа в результат. Здесь возможны две реализации: выберите первый или последний символ и соедините символ соответственно.
Используйте методыString::charAt
илиString::substring
(две версии).
Поскольку это, по-видимому, упражнение для самообучения, код решения не приводится.
Пожалуйста, имейте в виду, что StackOverflowError
это вполне возможно при рекурсии, если входная строка достаточно велика.
Комментарии:
1. Один вопрос: интересно,каков будет результат вышесказанного при использовании строки::подстрока,подобная этой: …return (str.подстрока(0, in).clone() buildString(str, in 1));
2. Зачем вам это нужно
clone
? Зачем вам понадобилось передаватьin 1
аргумент, который не был упомянут в вопросе ОП? Связан ли этот комментарий с другим ответом Черепахи?3. Да, это связано с ответом Черепахи. Цель Clone () состояла в том, чтобы предотвратить (или, возможно, рискнуть обратным) переполнение стека
4. Не уверен, как
clone()
можно предотвратитьStackOverflowError
, если строка имеет длину порядка 100 тыс.
Ответ №2:
Вы, наверное, захотите этим воспользоваться.
public static String buildString(String str, int in) { if(in == str.length()) return ""; return str.charAt(in) buildString(str, in 1); }
Передайте buildString(str, 0)
в качестве своего вклада.
Комментарии:
1.
in
на самом деле это не нужно