#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 хорошо выглядит как аргумент для рекурсивного вызова, вам просто нужно решить, как печатать новую строку и как повторять символы строк до и после рекурсии.