Java 递归调用的原理,我们再通过栈的角度来理解一下递归函数的调用过程,代码如下:
public static int factorial(int n){
if(n==0){
return 1;
}else{
return n*factorial(n-1);
}
}
public static void main(String[] args) {
int ret = factorial(4);
System.out.println(ret);
}
在factorial第一次被调用的时候,n是4,在执行到n*factorial(n-1)
,即4*factorial(3)
之前的时候,栈的情况大概如图所示。
注意,返回值存储器是没有值的,在调用factorial(3)
后,栈的情况如图所示。
栈的深度增加了,返回值存储器依然为空,就这样,每递归调用一次,栈的深度就增加一层,每次调用都会分配对应的参数和局部变量,也都会保存调用的返回地址,在调用到n等于0的时候,栈的情况如图所示。
这个时候,终于有返回值了,我们将factorial简写为f。f(0)的返回值为1; f(0)返回到f(1), f(1)执行1*f(0)
,结果也是1;然后返回到f(2), f(2)执行2*f(1)
,结果是2;接着返回到f(3), f(3)执行3*f(2)
,结果是6;然后返回到f(4),执行4*f(3)
,结果是24。
以上就是递归函数的执行过程,函数代码虽然只有一份,但在执行的过程中,每调用一次,就会有一次入栈,生成一份不同的参数、局部变量和返回地址。
酷客教程相关文章:
评论前必须登录!
注册