亲宝软件园·资讯

展开

Java 递归 Java 关于递归的调用机制精细解读

宁海没有七号公园 人气:0
想了解Java 关于递归的调用机制精细解读的相关内容吗,宁海没有七号公园在本文为您仔细讲解Java 递归的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java,递归,Java,递归机制,下面大家一起来学习吧。

方法的递归调用

1. 基本介绍:

简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题的同时让代码变得简洁,化繁为简是其核心思想。

2. 递归能解决什么问题?

3. 递归举例分析:

3.1 打印问题:

我们来看一哈这一段代码:

package com.recursion;

class Test{
    public void test(int n) {
        if (n > 2) {
            test(n - 1);
        }
        System.out.println("n=" + n);
    }
}

public class Recursion {
    public static void main(String[] args) {
      Test t1 = new Test();
      t1.test(4); //尝试输出看看
    }
}

代码截图:

在这里插入图片描述

运行结果:

在这里插入图片描述

结果分析:

为了看起来比较规范,首先我们先简单画出 JVM内存区域 ,这里只涉及到栈空间,堆空间和方法区:

在这里插入图片描述

接上图~~

在这里插入图片描述

到这里,我们大概就能懂为啥是先打印2,再打印3,最后才打印4了。

我们再来进一步拓展一下上述问题:

源代码:

package com.recursion;

class Test{
    public void test(int n) {
        if (n > 2) {
            test(n - 1);
        } else {  //唯一区别就是加了else
            System.out.println("n=" + n);
        }
    }
}

public class Recursion {
    public static void main(String[] args) {
      Test t1 = new Test();
      t1.test(4); //尝试输出看看
    }
}

代码截图:

在这里插入图片描述

运行结果:

在这里插入图片描述

尝试自己分析一下⑧,简单来说就是if执行了else就不执行,else执行了说明if也没执行。

3.2 阶乘问题:

源代码:

package com.recursion;

class Test01 {
    public int factorial(int n) {
        if (n == 1) {
            return 1;
        } else {
            return factorial(n - 1) * n;
        }
    }
}

public class Factorial {
    public static void main(String[] args) {
        Test01 test = new Test01();
        int ret = test.factorial(5);
        System.out.println("ret=" + ret);

    }
}

运行结果:

在这里插入图片描述

结果分析:大体上都跟前面的打印例子差不多,都是调用自身时在栈上开辟相应的栈帧,前面忘说了,栈帧其实会二次开辟的,啥意思呢,就是说调用方法时先在栈上分配一块较大的空间,也就是栈帧,而在栈帧内部还会进行一次具体的内存划分,具体到每一个变量。每个栈帧结束后将返回值返回给上一个栈帧,以此类推就能清晰明了的弄清楚递归的调用机制。

在这里插入图片描述

递归的重要规则:

加载全部内容

相关教程
猜你喜欢
用户评论