Можно ли использовать рекурсию?

384
29 июля 2021, 18:50

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

Пример Ввод

Four score and seven years ago our fathers brought forth upon this continent a new nation,conceived in liberty and dedicated to the proposition that all men are created equal

Вывод

Four score
and seven
years ago
our fathers
brought
forth upon
this
continent a
new nation,
conceived in
liberty and
dedicated to
the
proposition
that all men
are created
equal
Answer 1

Вот возможное решение на рекурсии:

public static void main(String[] args) {
    final String source = "Four score and seven years ago our fathers brought forth upon this continent a new nation";
    print(13, source.split("\\s"), 0);
}
static void print(final int length, final String[] tokens, int start) {
    final StringBuilder line = new StringBuilder();
    while (start < tokens.length) {
        final String token = tokens[start];
        if (line.length() == 0 || line.length() + 1 + token.length() < length) {
            start++;
            if (line.length() > 0) {
                line.append(' ');
            }
            line.append(token);
        } else {
            break;
        }
    }
    System.out.println(line.toString());
    if (start < tokens.length) {
        print(length, tokens, start);
    }
}

Но, если у вас есть возможность использовать сторонние библиотеки, то советую взять WordUtils#wrap:

public static void main(String[] args) {
    final String source = "Four score and seven years ago our fathers brought forth upon this continent a new nation";
    System.out.println(WordUtils.wrap(source, 13 - 1));
}

намного короче и проще. Хочу заметить, что в реализации WordUtils#wrap используются циклы, а не рекурсия, и эта реализация достаточно "монструозна".

READ ALSO
Зафиксировать первую строку в listView

Зафиксировать первую строку в listView

Имеется listview который выводит n строк, нужно как-то сделать так, чтобы при прокрутке этого списка, первая его строка всегда была на виду, те

186
vCard кнопка для сайта

vCard кнопка для сайта

Необходимо создать кнопку на сайте при клике на которую будет добавляться vCard(новый контакт в телефоне пользователя)Не могу найти нигде описание...

95
Не листаются слайды baguetteBox.js [закрыт]

Не листаются слайды baguetteBox.js [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

167