java中简单递归

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);

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值