Вы заметили, что высота треугольника 2 ^ n, я уверен. Итак, вы знаете, что вам нужно распечатать столько строк. Вы также знаете, что вам нужно помнить предыдущие строки, если вы собираетесь каким-то образом их скопировать, так что вы знаете, что вам нужно где-то их хранить - возможно, Vector?
Для начала немного проще создать треугольник, наклоняющийся влево, а не вправо. Добавление левого отступа, чтобы он наклонился вправо, легко сделать, если у вас что-то получится.
Начните с одной строки, содержащей «*»: напечатайте ее и сохраните эту строку.
Тогда сделайте это 'n' раз:
- Создайте строку, у которой вы уже получили 'квадрат', но добавьте пробелы к их концам, пока все они не станут равными по длине
- Для каждой уже существующей строки (я имею в виду, не включая новые, которые мы создаем ниже):
- распечатать дважды
- сохранить то, что вы только что напечатали, в новой строке
Вот и все. Просто добавьте пробелы слева от всего, что вы печатаете, чтобы он наклонился вправо.
(Вы можете заметить, что, сделав это, вы можете сделать первый шаг выше внутри цикла for
под ним. Когда вы «делаете строки квадратными», вы на самом деле просто вычисляете число пробелы для добавления в каждую строку. Просто добавив столько пробелов между двумя копиями текущей строки, в распечатке и в новой сохраненной вами строке, вы сохраните распечатку [и сохранение] всех ненужных пробелов.)
Вот несколько полезных функций заполнения строк. padRight
увеличит длину строки до n
символов, добавив пробелы справа. padLeft
, как вы уже догадались, слева добавятся пробелы:
public static String padRight(String s, int n) {
return String.format("%1$-" + n + "s", s);
}
public static String padLeft(String s, int n) {
return String.format("%1$#" + n + "s", s);
}
Последняя возможность для бонусных баллов: вам на самом деле не нужно хранить последнюю половину строк, которые вы распечатываете.