Вертикальная печать строки с использованием рекурсии в Java - PullRequest
2 голосов
/ 12 ноября 2009

Эй, я работаю над проблемой, когда вы печатаете строку вертикально, используя рекурсию. Я знаю, как это сделать, если бы я использовал цикл for:

for (int i = 0; i < str.length(); i++) {

   System.out.println(str.charAt(i));

но я не совсем уверен, как это сделать с помощью рекурсии. Я позаботился о базовом случае, но я не уверен, как продолжить:

if (str == null || str.equals("")) {

    return str;

Любая помощь будет принята с благодарностью. Спасибо !!!

Ответы [ 5 ]

1 голос
/ 12 ноября 2009
public void printVertString(String str) {
    if (str != null && str.length > 0) //1 base condition
    {
        System.out.println(str.charAt(0)) //2 print first char
        printVertString(str.substring(1)) //3 recursive call, but first char is omitted
    }
}

Что это делает:

  1. Убедитесь, что строка не пустая (базовый случай). Если это так, тогда больше не должно быть рекурсии, и метод просто возвращается, ничего не делая
  2. Вывести первый символ строки
  3. Звонит сам, но только со вторым символом вперед

Итак, если вы отправите ему str = "CAT", произойдет следующее (отступы различают различные вызовы одной и той же функции)

1 str is "CAT" --> not empty
2 print "C"
3 call printVertString "AT"
    1 str is "AT" --> not empty
    2 print "A"
    3 call printVertString "T"
        1 str is "T" --> not empty
        2 print "T"
        3 call printVertString ""
            1 str is "" --> EMPTY
            return
1 голос
/ 12 ноября 2009

Если есть сомнения, вы всегда можете перевести итерацию напрямую в рекурсию:

for (int i = 0; i < str.length(); i++)
    System.out.println(str.charAt(i));

... становится:

public void printVertical(String str, int i) {
    if (i < str.length()) {
        System.out.println(str.charAt(i));
        printVertical(str, i + 1);
    }
}

String inputStr = ...
printVertical(inputStr, 0);

Обратите внимание, что есть много способов сделать это более элегантно. Это похоже на домашнее задание для меня. Я бы посоветовал вам найти один из субъективно лучших подходов, а не использовать мой «слепой перевод» вашего цикла.

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

Ключ к пониманию рекурсии - это понимание рекурсии. (ба дам бум)

А если серьезно, вы должны подумать об этом с точки зрения создания меньшей проблемы из проблемы, которая у вас уже есть. В этом примере у вас есть строка некоторой длины; Как вы могли бы напечатать часть этой строки, а затем иметь меньшую строку, чтобы повторить процесс? Это основная идея рекурсии.

Ваш базовый случай верен, так что вы могли бы сделать это, используя библиотеки Java и код выше:

public String printVertical(String str)
{
    if (str == null || str.equals(""))
    {
        return str;
    }
    else
    {
        System.out.println(str.charAt(0));
        return printVertical(str.substring(1, str.length);
    }
}
0 голосов
/ 12 ноября 2009

Это должно сработать:

void foo (final String str) {
    if (null != str && str.length > 0) {
        System.out.println(str.charAt(0))
        foo(str.substring(1))
    }
}

Смысл рекурсии в том, что у вас есть функция, которая вызывает себя.

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

Почему вы хотите сделать что-то подобное? Это явно тот случай, когда итеративный процесс будет более понятным и более легким для реализации, чем рекурсивная реализация.

Есть несколько способов справиться с этим рекурсивно. Поскольку вы работаете с Java, я бы порекомендовал вам взглянуть на метод String.substring в базовой библиотеке java.

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