概念
- 递归的概念简单来说就是在方法里调用自己的方法。
- 上一次方法执行的结果会成为下一次执行的初始条件
- 递归分两种:直接递归、间接递归(A调用B,B调用C,C调用A)
要点
- 构造方法不可递归
- 递归必须有结束条件(StackOverflowError)
- 递归的次数不能太多(StackOverflowError)
分支递归
分支递归就是方法里多次调用自身方法
public void A(int a){
...
A(a);
A(b);
A(c);
}
- 运行逻辑
上述方法中,假设递归有3个分支,程序只递归2次。程序流程图如图所示,紫色的主函数有两个蓝色的递归分支,然后每个蓝色递归分支中又有三个黄色的分支。然后程序按照流程图的箭头所示运行,值得注意的是,每个分支都是单独运行,它们互相不影响 ,但是分支运行是有顺序的,每个分支执行完成后会执行return语句返回上一级。
- 函数堆栈
函数堆栈的意义在于决定函数执行的先后顺序,其规则在于先进后出,后进先出。我们用上述的运行逻辑解释函数堆栈,这样我们也清楚这个return语句的意义。
对应颜色看,return语句(返回上一级函数)就是按照函数出栈的顺序来执行。
谢尔宾斯基三角形
递归的核心思想就是把一个复杂的问题拆分成几个可用重复的方法实现的小问题。
谢尔宾斯基三角形如图所示,其构造方法如下:
- 取一个实心三角形
- 沿三边中点连线将三角形分割成四个小三角形
- 去掉中间的三角形
- 其余三角形重复操作1
代码展示
package Recursion;
import java.awt.*;
import javax.swing.JFrame;
public class DrawPad extends JFrame{
int[] x = new int[] {
400, 200, 599};
int[] y = new int[] {
200, 599, 599};
public DrawPad() {
setTitle("三角分形");
setSize(800,800);
setDefaultCloseOperation<