谢尔宾斯基地毯

先看成品:

谢尔宾斯基地毯

实现思路:迭代递归

  • 以画整张地毯的思路画某一块地毯,注意终止条件

需要的函数:

1
fillRect(x,y,w,h);//矩形左上角坐标+宽、高 

前置知识:

  1. 继承
1
2
3
4
public void DrawCarpet extends JFrame
//这里的意思是:
//DrawCarpet类继承了JFrame,于是在DrawCarpet类中可以直接调用JFrame的所有方法
//(DrawCarpet是JFrame的子类)

2.构造函数

1
2
3
4
public void DrawCarpet extends Jframe{
public DrawCarpet(){}
}
//与类同名的函数不声明类型,这样在调用DrawCarpet类时会自动执行DrawCarpet()函数中的指令

3.重构

1
2
3
4
5
6
7
@Override
public void paint(Graphics g){
super.paint(g);
DrawCarpet();
}
//@Override用来声明我们要自己重写java中自带的paint()函数,
//而super.paint(g)的意思是继承原本paint()函数中的所有方法

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Scarpet extends JFrame {
public Scarpet(){
setTitle("谢尔宾斯基地毯");
setSize(800,800);
setResizable(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
draw(150,150,500,500,g);
}
public void draw(int x,int y,int w,int h,Graphics g){
if(w<3) return ;
g.fillRect(x+w/3,y+h/3,w/3,h/3);
draw(x,y,w/3,h/3,g);
draw(x+w/3,y,w/3,h/3,g);
draw(x+2*w/3,y,w/3,h/3,g);
draw(x,y+h/3,w/3,h/3,g);
draw(x+2*w/3,y+h/3,w/3,h/3,g);
draw(x,y+2*h/3,w/3,h/3,g);
draw(x+w/3,y+2*h/3,w/3,h/3,g);
draw(x+2*w/3,y+2*h/3,w/3,h/3,g);
}
public static void main(String[] args) {
new Scarpet();
}
}

通过Java,我们得以可视化递归的过程,显现递归之美。