Java 递归调用的原理

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)之前的时候,栈的情况大概如图所示。
Java 递归调用的原理

注意,返回值存储器是没有值的,在调用factorial(3)后,栈的情况如图所示。
Java 递归调用的原理

栈的深度增加了,返回值存储器依然为空,就这样,每递归调用一次,栈的深度就增加一层,每次调用都会分配对应的参数和局部变量,也都会保存调用的返回地址,在调用到n等于0的时候,栈的情况如图所示。
Java 递归调用的原理

这个时候,终于有返回值了,我们将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。

以上就是递归函数的执行过程,函数代码虽然只有一份,但在执行的过程中,每调用一次,就会有一次入栈,生成一份不同的参数、局部变量和返回地址。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!