一、递归是指直接或间接地调用自身。
二、递归的注意事项;
A:要有出口,否则就是死递归
B:次数不能过多,否则内存溢出
C:构造方法不能递归使用
三、举例子
递归求阶乘
/** * 求5的阶乘 * * @author sun * */ public class Test { public static void main(String[] args) { System.out.println(factorial(5)); } private static int factorial(int n) { if (n == 1) { return 1; } else { return n * factorial(n - 1); } } }
在jvm篇中,我们已经知道jvm有五大区域,其中栈、堆、方法区是我们必须知道干嘛的,因为程序的运行跟着息息相关。
方法区:保存JVM装载的类的信息。
栈:Java栈中的每个帧都保存一个方法调用的局部变量、操作数栈、指向常量池的指针等,且每一次方法调用都会创建一个帧,并压栈。
堆:应用系统的对象都保存在Java堆中。列如:Student s = new Student();
1、加载Student.class文件进内存
2、在栈内存为s开辟空间
3、在堆内存为学生对象开辟空间
4、对学生对象的成员变量进行默认初始化
5、对学生对象的成员变量进行显示初始化
6、通过构造方法对学生对象的成员变量赋值
7、学生对象初始化完毕,把对象地址赋值给s变量
每一个方法的调用都会产生一个栈帧,压入到方法栈,当递归调用的时候,方法栈中栈帧的图示和上图类似。
栈 主要是用来存放栈帧的,每执行一个方法就会出现压栈操作,所以采用递归的时候产生的栈帧比较多,递归就会影响到内存,非常消耗内存。所以能不用递归尽量不用递归。