递归--谢宾斯基三角形、赛尔平斯基地毯
程序员文章站
2024-02-21 18:51:28
...
递归
为实现一个结果,需要调用多次类似的方法,因此会产生重复代码,那么,我们就可以用到递归;递归的正确使用需要条件来退出循环,否则产生存储溢出现象。
谢宾斯基三角形
每一个正三角形三条边中点的连线产生四个小正三角形,其中有三个正向,一个倒向;再连接三个正向小正三角形的中点连接,每个小正三角形也会产生四个小小正三角形,以此类推。
//主方法
public static void main(String[] args) {
Demotri frame = new Demotri();
frame.ShowUI();//调用ShowUI
}
//创建窗体界面
public void ShowUI(){
JFrame ShowFrame= new JFrame("展示界面");
ShowFrame.setSize(800,800);//设置窗体尺寸
ShowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭即退出
ShowFrame.setLocationRelativeTo(null);
ShowFrame.setVisible(true);//可视化
Graphics g = ShowFrame.getGraphics();//画笔从窗口获取对象
System.out.println(g);
drawLine(3,g,400,50,500);//调用下面的drawLine
}
接下来利用递归思想画谢宾斯基三角形,drawLine中有几个参数,循环次数、画笔、顶点x坐标、顶点y坐标、正三角形边长。
顶点坐标(x,y)左顶点(x-lengthsin30,y+lengthcos30)
右顶点(x+lengthsin30,y+lengthcos30)
再取每条边中点,进行连接划线,以此类推,随着count不断递减,if循环结束,即退出了递归
public void drawLine(int count,Graphics g,int x,int y,int length){
if(count<0){
return;
}
count--;
int x1=x-length/2;
double x2=x+length/2;
double y1=y+length*Math.sqrt(3)/2;
double y2=y+length*Math.sqrt(3)/2;
//强制整型
int x11=(int)x1;
int x21=(int)x2;
int y11=(int)y1;
int y21=(int)y2;
//画三角形
g.drawLine(x11, y11, x21, y21);
g.drawLine(x, y, x21, y21);
g.drawLine(x11,y11,x,y);
//取一边的中点
int x3=(x+x11)/2;
int y3=(y+y11)/2;
int x4=(x+x21)/2;
int y4=(y+y21)/2;
int x5=(x11+x21)/2;
int y5=(y11+y21)/2;
//画中间倒三角形
g.drawLine(x3, y3, x4, y4);
g.drawLine(x3, y3, x5, y5);
g.drawLine(x4,y4,x5,y5);
//递延0.2s
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
drawLine(count,g, x,y,length/2);
drawLine(count,g, x3,y3,length/2);
drawLine(count,g, x4,y4,length/2);
}
}
赛尔平斯基地毯
注意看图片,将一个大正方形分为9格,实心正方形在中间,其余八个再接着分成9个小正方形,并且中间为实心正方形,以此类推。
public static void main(String[] args) {
Demorect frame = new Demorect();
frame.ShowUI();
}
public void ShowUI() {
// 创建窗体界面
JFrame ShowFrame = new JFrame("实心正方形");
ShowFrame.setSize(800, 800);
ShowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ShowFrame.setLocationRelativeTo(null);
ShowFrame.setVisible(true);
Graphics g = ShowFrame.getGraphics();
System.out.println(g);
drawMyrect(g, 50, 50, 500, 500, 3);
}
递归思想,每个大正方形顶点为(x,y)中间的小正方形为实心,如此小正方形顶点应该为(x+w/3, y+h/3),边长为w/3、h/3。此处递归用到for循环。
public void drawMyrect(Graphics g,int x,int y,int w,int h,int count) {
if(count<0){
return;
}
count--;
g.fillRect(x+w/3, y+h/3, w/3, h/3);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int i=0;
int j=0;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
drawMyrect(g,x+i*w/3, y+j*h/3, w/3, h/3,count);
}
上一篇: 牛客每日一题 7月3日 毒瘤xor (前缀和+贪心)
下一篇: 全排列和全组合