#java #recursion
#java #рекурсия
Вопрос:
Я пишу программу, которая отображает шаблон Адамара с использованием рекурсии.
Шаблон Адамара размером 1 на 1 представляет собой один черный квадрат. В общем случае шаблон Адамара размером 2N на 2N получается путем выравнивания 4 копий шаблона N на N в виде сетки размером 2 на 2, а затем инвертирования цветов всех квадратов в нижней правой копии размером N наN.
Я хотел бы создать ту же картинку, что и эта
Мой код:
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class Hadamard extends JPanel{
@SuppressWarnings("unused")
private void hadamard(Graphics g, int n, int x, int y, int width, int height){
if(n == 0){
g.fillRect(x/2, y/2, width, height);
return;
}
else{
hadamard(g, n-1, x, y, width/2, height/2);
hadamard(g, n-1, x width, y, width/2, height/2);
hadamard(g, n-1, x, y height, width/2, height/2);
g.setColor(Color.WHITE);
hadamard(g, n-1, x width, y height, width/2, height/2);
g.setColor(Color.BLACK);
}
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
hadamard(g, 2, getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2);
}
public static void main(String[] args) {
Hadamard panel = new Hadamard();
JFrame app = new JFrame();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.add(panel);
app.setSize(516, 538);
app.setVisible(true);
}
}
Я неправильно меняю цвета квадратов в правом нижнем углу. Я застрял на этом шаге последние пару часов и надеюсь, что кто-нибудь подскажет мне, как это сделать правильно, потому что я не знаю.
Заранее благодарю вас. Nath
Ответ №1:
Ваш код не инвертирует нижний правый сектор, он просто заставляет его быть белым.
Я бы сказал, что лучшим решением является добавление дополнительного параметра к вашему рекурсивному методу (назовем его b
), значение которого может быть true
или false
. Затем вы можете выполнить рекурсию как:
hadamard(g, n-1, x, y, width/2, height/2, b);
hadamard(g, n-1, x width, y, width/2, height/2, b);
hadamard(g, n-1, x, y height, width/2, height/2, b);
hadamard(g, n-1, x width, y height, width/2, height/2, !b);
Затем, когда вы перейдете к fillRect
вызовам, выберите белый или черный в зависимости от значения b
.
Комментарии:
1. @Oli Следуя вашему совету, я изменил свой код:`private void hadamard (графика g, int n, int x, int y, int width, int height, логическое значение b){ if(n == 0){ if (b == true) g.setColor(Цвет. ЧЕРНЫЙ); иначе g.setColor(Цвет. БЕЛЫЙ); g.fillRect(x/2, y /2, width, height); return; } else{ адамар (g, n-1, x, y, width/2, height/2, true); адамар (g, n-1, x width, y, width/2, height/2, true); адамар(g, n-1, x, y height, width/2, height/2, true); адамар(g, n-1, x, y height, width/2, height/2, true); адамар (g, n-1 , x ширина, y высота, width/2, высота/2, false); } }`
2. @Nath: Это все равно не сработает. Вы жестко кодируете значение
b
при рекурсивных вызовах!3. @Oli Как я могу отформатировать свой код в удобочитаемом формате? Я использовал
code
, но код не похож на тип блока.4. @Nath: Если вы пишете в комментарии, вы можете поместить код между обратными ссылками. Но я рекомендую отредактировать ваш вопрос, чтобы включить в него ваш новый код.
5. @Oli — Я понял. Я исправил код. Это отлично работает. Большое тебе спасибо за твою помощь, Оли. Я ценю это.