java基础06 Java中的递归

          一、递归是指直接或间接地调用自身。

    二、递归的注意事项;
             A:要有出口,否则就是死递归
    B:次数不能过多,否则内存溢出
    C:构造方法不能递归使用

          三、举例子

     递归求阶乘

java基础06 Java中的递归

/**
 * 求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变量

每一个方法的调用都会产生一个栈帧,压入到方法栈,当递归调用的时候,方法栈中栈帧的图示和上图类似。

栈 主要是用来存放栈帧的,每执行一个方法就会出现压栈操作,所以采用递归的时候产生的栈帧比较多,递归就会影响到内存,非常消耗内存。所以能不用递归尽量不用递归。