бесконечно повторять — Sytax — printStars (строки — 1);

#java #recursion #data-structures

#java #рекурсия #структуры данных

Вопрос:

Мне было дано задание получить следующий результат: с помощью in recursion.

 ****
***
**
*
**
***
****
  

Моя проблема в том, что я не могу использовать какие-либо циклы и должен компилировать код строго с одним параметром рекурсии с помощью printStars (lines).

Вот мой код:

 public static void printStars(int lines) {
    if (lines==1) { //base case
        System.out.print("*");
    }else if (lines>1){ //recursive case
        printStars(lines-1);
        System.out.print("*");
  

Однако выводится только на печать:

 Please enter a number: 4
****BUILD SUCCESSFUL (total time: 2 seconds)
  

Я могу заставить это отлично работать с циклом for, однако, учитывая это ограничение циклов, мне нужно, чтобы эта работа выполнялась только в рекурсии. Я прочитал методы для изменения цикла for на рекурсию, но я все еще в замешательстве. Есть помощь или идеи?

Спасибо,

Комментарии:

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

Ответ №1:

В вашем текущем коде вы вызываете printStars(4). Когда это вызывается, код рекурсивно вызывает printStars(3), printStars(2), затем printStars(1).

Первый * поступает из printStars(1). Когда это возвращается, второй * печатается printStars (2) после рекурсивного вызова. Третий * печатается в printStars(3) после рекурсивного вызова, а четвертый * — после рекурсивного вызова в printStars(4).

Подумайте о проблеме и посмотрите на форму выходных данных, которые вы ищете. Шаблон равен 4,3,2,1,2,3,4 с начальным вводом 4. Похоже, вам нужно следовать шаблону, подобному:

 public static void printStars(int lines) {
    if (lines ==1) {
        System.out.print("*");
    }
    else {
        // Do something before recursion
        // Recurse
        // Do something after recursion
    }
}
  

Для вашего вывода вы должны увидеть, как это происходит:

 **** //printed when lines==4
***  //printed when lines==3
**   //printed when lines==2
*    //printed when lines==1
**   //printed when lines==2
***  //printed when lines==3
**** //printed when lines==4
  

Комментарии:

1. Я долго и упорно думал об этой проблеме. Похоже, я немного сбит с толку, потому что у меня есть рекурсивный метод, выполняющий printStars (lines-1); Однако я не понимаю, что мне нужно сделать, чтобы все звезды выводились правильно одна за другой, если строка ==1 должна быть напечатана одна звезда. Однако, если строки> = 1, должны быть выполнены printStars (строки-1); что должно привести к 4, 3, 2, 1 правильно??

2. Вот подсказка, обычно в подобных задачах вам было бы разрешено использовать цикл внутри рекурсивного метода. Когда ваш инструктор говорит, что циклов нет, я почти уверен, что они говорят о том, чтобы не использовать цикл для решения внешней проблемы печати каждой строки. Ваш базовый вариант выглядит в основном хорошо, а lines-1 хорошо выглядит как аргумент для рекурсивного вызова, вам просто нужно решить, как печатать новую строку и как повторять символы строк до и после рекурсии.