递归
1.概念
当解决一个问题可以分解为对应其相同问题的‘小’一点的问题时,就可以叫做递归。用到函数用,也就是函数本身调用了自己就可以叫做递归。
2.步骤
(1)明确这个函数要干什么
(2)找到等价关系
(3)找到递归结束条件
3.实例
假设我们现在要画一条直线,然后每次都继续在这条直线上面画出他左右都少20个像素的线条,就像画出一个金字塔一样
- 先新建一个画布
public void init(){
JFrame jf = new JFrame();
jf.setTitle("递归");
jf.setSize(800,800);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
Graphics g = jf.getGraphics();
}
-
想要在画布上操作,我们需要一个监听器,我们现在新建一个类来实现MouseListener1
想要在画布上画画,首先我们需要获取鼠标点击的位置和释放的位置,然后画出第一条直线
public class MouseListener1 implements MouseListener{ int x1,x2; int y=700;//为了保证‘金字塔’能显示完整 int dis=10;//每条线之间的距离 Graphics g; @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub x1=e.getX(); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub x2=e.getX(); } }
现在正式开始我们的递归思路
1.这个函数要干什么
我们知道这个函数是用来画‘金字塔’的,而‘金字塔’又是需要画线的,归根到底他就是用来画线的,那我们先让他画一条线。
public void draw(int x1,int x2,int y)
{
g.drawLine(x1, y, x2, y);
}
看下效果:
现在最底层的线就已经画出来拉,然后我们要让他自己去画上面的线
2.寻找等价关系
上面我们说了,每次上面一条线就是要比下面的左右短个20个像素,在他上面高出一个dis的距离
我们可以在函数中加入:
draw(x1+20,x2-20,y-dis);
让我们看下效果:
这时我们发现,她画出‘金字塔’之后反过来话了到三角,这是因为x2<x1的原因造成的
3.找到递归结束条件
由上可知,递归到x1>x2的时候就不能再继续了,所以我们加上条件
public void draw(int x1,int x2,int y)
{
g.drawLine(x1, y, x2, y);
if((x1+20)<(x2-20))
{
draw(x1+20,x2-20,y-dis);
}
}
最终结果:
我们可以自己调整数据得到不同的图形