前两天在看Lua,看到一个Demo,是个递归,当时脑子看的有点懵逼...没想出来是怎么回事...
然后我用Java写了一下(还是java代码熟悉一点)
public static void main(String[] args) {
int number = 3;
System.out.println(fact(number));;
}
private static int fact(int number) {
if (number == 0) {
return 1;
} else {
int num = fact(number - 1);
return number * num;
}
}
通过运行上面的代码或者目测,可以发现,递归fact()往下一共四层,
看IDEA 的bebug信息,main主线程的Java虚拟机栈中,有四个栈帧。
查看 Frames中四个栈帧,发现number分别(4-1)是:0、1、2、3
当number=0时,递归结束,Java虚拟机栈 入栈到底。
还记得之前学习过 Java虚拟机栈和栈帧嘛?
每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在Java虚拟机栈中,从入栈到出栈的过程。
这里方法执行的是递归,通过IDEA Frames可看到,一共四层栈帧;
形象一点,如下图,每一个小块都是一个栈帧,对应着都是一个fact方法!
当递归结束的时候,对于执行引擎的当前线程来说,只有在栈顶的栈帧是有效的,称为当前栈帧。
也就是说当前栈帧是4号栈帧。
之前说过,上面4个栈帧,就是执行4次fact()方法
跟着代码,继续往下走:
private static int fact(int number) {
if (number == 0) {
return 1;
} else {
int num = fact(number - 1);
return number * num;
}
}
4号栈帧的number为0,if分支直接return 1,这里出栈了。
3号栈帧中
number = 1
int num = fact(number - 1),返回结果是1,所以num=1;
执行操作数栈 number * num,结果是1 ,然后return,3号栈帧出栈。
2号栈帧中
number = 2
int num = fact(number - 1),返回结果是1,所以num=1;
执行操作数栈 number * num,结果是2,然后return,2号栈帧出栈。
1号栈帧中
number = 3;
int num = fact(number -1),返回结果是2,所以num=2;
执行操作数栈 number * num ,结果是6。
最后计算完成。
通过下面的图例,来看下这个过程
以上就是粗略的分析,如有错误,希望指正