文章目录
- 前言
- 一、递归是什么?
- 二、使用步骤
- 1.画一个递归正方形
- 2.递归山脉的实现
前言
发现java里的算法和数据结构还是最关键的,有空多学学算法,尽量成为一个工程师而不是码农
提示:以下是本篇文章正文内容,下面案例可供参考
一、递归是什么?
定义 在计算机科学中是指通过重复将问题分解为同类的子问题而解决问题的方法,查了下百度:递归定义是数理逻辑和计算机科学用到的一种定义方式,使用被定义对象的自身来为其下定义(简单说就是自我复制的定义),感觉更看不懂了。。,一般来说,递归就是函数(方法)调用自身,然后递归得有结束条件。
找到这问题要干什么,即方法、函数
分析问题,找到相同的子问题
列出所有的参数,找到那些参数是需要迭代的(关键)
找到递归出口
二、使用步骤
1.画一个递归正方形
画正方形的思路大概就是,先创建一个窗体,加上画笔,画一个初始的正方形,并且在这个正方形正中间画一个填充正方形,大概是在边长的1/3处,填充好矩形之后,按照填充矩形的边长1/3画出八个小矩形,不停地调用这个函数自身,实现递归的方法。
以下是代码段:(先创建一个窗并且加上按钮,命名为"正方形")
//保存传递过来的方法
public Graphics graphics;
public int x1,x2,y1,y2,z1,z2,w1,w2;
public int i=0;
int count =1;
String name;
if("正方形".equals(name)) {
graphics.drawRect(h,j,q,w);
graphics.fillRect(h+q/3,j+ q/3, q/3, w/3);
drawRect(5,h+q/3,j+ q/3, q/3, w/3);
}
public void drawRect(int count,int h,int j,int q,int w) {
if(count<0) {
return;
}
count --;
graphics.fillRect(h-q*2/3,j-q*2/3,q/3, q/3);
drawRect(count,h-q*2/3,j-q*2/3,q/3, (q/3));
graphics.fillRect(h+q*1/3,j-q*2/3,q/3,q/3);
drawRect(count,h+q*1/3,j-q*2/3,q/3,q/3);
graphics.fillRect(h+q*4/3,j-q*2/3,q/3,q/3);
drawRect(count,h+q*4/3,j-q*2/3,q/3,q/3);
graphics.fillRect(h-q*2/3,j+q*4/3,q/3, q/3);
drawRect(count,h-q*2/3,j+q*4/3,q/3, q/3);
graphics.fillRect(h-q*2/3,j+q*1/3,q/3, q/3);
drawRect(count,h-q*2/3,j+q*1/3,q/3, q/3);
graphics.fillRect(h+q*4/3,j+q*1/3,q/3,q/3);
drawRect(count,h+q*4/3,j+q*1/3,q/3,q/3);
graphics.fillRect(h+q*4/3,j+q*4/3,q/3,q/3);
drawRect(count,h+q*4/3,j+q*4/3,q/3,q/3);
graphics.fillRect(h+q*1/3,j+q*4/3,q/3,q/3);
drawRect(count,h+q*1/3,j+q*4/3,q/3,q/3);
}
2.递归山脉的实现
大概思路就是给定两个点(x1,y1),(x2,y2),然后取他们的中点(px,py),然后再取(x1,y1)和(px,py)的中点和(x2,y2)和(px,py)的中点,同时给定一个范围[-range,range]和一个比率rate,每次取中点后的中点纵坐标都加上这个范围内的随机值,每次中点后range都乘以rate来缩小range的范围。当两个点的横坐标小于某个值或者不能再取中点时就连接起来,即可。
代码如下:
if("山脉".equals(name)) {
graphics.setColor(Color.black);
int x1=10;
int y1=500;
int x2=1250;
int y2=600;
int range=300;
double rate = 0.5;
for(int i = 0;i<3;i++) {
draw(x1,y1,x2,y2,graphics,range,rate);
}
public void draw(double px3,double e,double px2,
double d,Graphics graphics,int range,double rate) {
if(Math.abs(px3-px2)<=1|range==0) {
graphics.drawLine((int)px3, (int)e,(int) px2,(int) d);
}else {
Polygon polygon = new Polygon();
graphics.fillPolygon(polygon);
Random random = new Random();
int xy1 = random.nextInt(500);
int xy2=random.nextInt(500);
double px=(px3+px2)/2;
double py=(e+d)/2;
Random random2=new Random();
int num=random2.nextInt(range*2)-range;
range=(int)(range*rate);
draw(px3,e,px,py-num,graphics,range,rate);
draw(px,py-num,px2,d,graphics,range,rate);
}
}
效果图如下:
递归算法在java中是经常会用到的,重点是在函数调用自身。