Рекурсивное создание копии строки

#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:

  1. Укажите условие выхода: если входная строка пуста, верните пустую строку.
    Использовать методы String::isEmpty или String::length
  2. Вызов 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 на самом деле это не нужно