1.递归实现方法
简单的可以称作程序自己调用自己,
2.代码中通常可以通过什么方式实现?
2.1方法自己调用自己本身,同时设置跳出的条件 终止递归调用
2.2类中创建本类对象
3.递归如果循环到底,会产生栈溢出的错误:
栈溢出:
栈:是一个先进后出的一种数据结构 可以使用数组/链表/队列(先进先出)来实现
java程序运行在JVM上面,JVM是一个小型的操作系统,一个Java程序有一个独立的JVM
JVM的主要内存结构:
堆内存:存储所有的对象数据
栈内存:存储所有需要执行的代码指令/存储指令中使用的本地变量
3.递归绘制图形的练习:
三段线,谢尔宾斯基矩形 、谢尔宾斯基三角形 ,给定两个点,求中点,递归为两段,每次求的中会在+-r范围内随机取Y值,随着 递归层数的增加,r的范围按比例减少。
package lcr0403.Draw;
import javax.swing.*;
import java.awt.*;
public class DrawUI extends JFrame{
String[] type = {"三线段","谢尔宾斯基矩形","谢尔宾斯基三角形","Kline"};
lcr0403.Draw.ActionMouse am = new ActionMouse();
public void shouUI(){
setTitle("画板");
setSize(800,800);
setDefaultCloseOperation(EXIT_ON_CLOSE);
FlowLayout fl =new FlowLayout();
setLayout(fl);
for (int i = 0; i < type.length; i++) {
JButton jb = new JButton();
jb.setText(type[i]);
jb.addActionListener(am);
add(jb);
System.out.println(i);
}
setVisible(true);
addMouseListener(am);
am.g = getGraphics();
}
public static void main(String[] args) {
new DrawUI().shouUI();
}
}
package lcr0403.Draw;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
public class ActionMouse implements ActionListener, MouseListener {
Graphics g;
int x1,y1,x2,y2,x3,y3,x4,y4,x5,y5;
String type ;
int count =0;
@Override
public void actionPerformed(ActionEvent e) {
type = e.getActionCommand();
}
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (type.equals("谢尔宾斯基三角形")) {//三角形
if (count == 0) {
x3 = x;
y3 = y;
count++;
} else if (count == 1) {
x4 = x;
y4 = y;
count++;
} else if (count == 2) {
x5 = x;
y5 = y;
xtDraw(x3,y3,x4,y4,x5,y5,3);
x3 = x4 = x5 =0;
y3 = y4 = y5 =0;
count = 0;
}
}
}
@Override
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
if(type.equals("三线段")){
tDraw(x1,x2,y1);
} else if (type.equals("谢尔宾斯基矩形")) {
xDraw(x1,y1,x2,y2);
} else if (type.equals("Kline")) {
randomLine(x1,y1,x2,y2,800);
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
public void tDraw(int x1,int x2,int y){
if(x2-x1 <2){
return;
}
int px1 = x1+(x2-x1)/3;
int px2 = x1+(x2-x1)*2/3;
g.drawLine(x1,y,px1,y);
g.drawLine(px2,y,x2,y);
tDraw(x1,px1,y+50);
tDraw(px2,x2,y+50);
}
public void xDraw(int x1,int y1,int x2,int y2){
//g.drawRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));
if(Math.abs(x1-x2)<5){
return;
}
int px1 = x1+Math.abs(x1-x2)/3;
int py1 = y1+Math.abs(y1-y2)/3;
int px2 = x1+Math.abs(x1-x2)*2/3;
int py2 = y1+Math.abs(y1-y2)*2/3;
g.fillRect(Math.min(px1,px2),Math.min(py1,py2),Math.abs(px1-px2),Math.abs(py1-py2));
xDraw(x1,y1,px1,py1);
xDraw(px1,y1,px2,py1);
xDraw(px2,y1,x2,py1);
xDraw(x1,py1,px1,py2);
xDraw(px2,py1,x2,py2);
xDraw(x1,py2,px1,y2);
xDraw(px1,py2,px2,y2);
xDraw(px2,py2,x2,y2);
}
public void xtDraw(int x1,int y1,int x2,int y2,int x3,int y3,int n){
if(n == 0){
return;
}
g.drawLine(x1, y1, x2, y2);
g.drawLine(x3, y3, x2, y2);
g.drawLine(x1, y1, x3, y3);
int px1 = (x1+x2)/2;
int py1 = (y1+y2)/2;
int px2 = (x2+x3)/2;
int py2 = (y2+y3)/2;
int px3 = (x1+x3)/2;
int py3 = (y1+y3)/2;
// g.drawLine(px1, py1, px2, py2);
// g.drawLine(px3, py3, px2, py2);
// g.drawLine(px1, py1, px3, py3);
n--;
xtDraw(x1,y1,px1,py1,px3,py3,n);
xtDraw(px1,py1,x2,y2,px2,py2,n);
xtDraw(px3,py3,px2,py2,x3,y3,n);
}
public void randomLine(int x1,int y1,int x2,int y2,int r){
if(r <= 1){
return;
}
int midX = (x1+x2)/2;
Random ran = new Random();
int rn = ran.nextInt(r*2)-r;
int midY = (y1+y2)/2+rn;
r = r *2/3;
g.drawLine(midX,midY,midX,midY);
randomLine(x1,y1,midX,midY,r);
randomLine(midX,midY,x2,y2,r);
}
}