Java基础 第四节 第九课

举报
我是小白呀iamarookie 发表于 2021/09/10 22:55:34 2021/09/10
【摘要】 递归 概述递归累加求和分析代码展示代码执行图解 递归求阶乘分析代码展示 递归打印多级目录分析代码展示 概述 递归: 指在当前方法内调用自己的这种现象. 递归的分类: 递归分为...

概述

递归: 指在当前方法内调用自己的这种现象.

递归的分类: 递归分为两种, 直接递归和间接递归:

  • 直接递归称为方法自身调用自己
  • 间接递归可以 A 方法调用 B 方法, B 方法调用 C 方法, C 方法调用 A 方法

注意事项:

  • 递归一定要有条件限定, 保证递归能够停下来, 否则会发生栈内存溢出
  • 在递归中虽然有限定条件, 但是递归次数不能太多. 否则也会发生栈内存溢出
  • 构造方法, 禁止递归

递归累加求和

计算 1~n 的和

分析

分析: num 的累和 = num + (num-1) 的累和. 所以可以把累和的操作定义成一个方法, 递归调用.

代码展示

public class Test {
    public static void main(String[] args) {
        // 计算1~num的和, 使用递归完成
        int num = 5;
        // 调用求和方法
        int sum = getSum(num);
        // 调试输出
        System.out.println(sum);
    }

    /**
     * 通过递归算法实现
     * @param num 添加的数字
     * @return 返回总和
     */
    public static int getSum(int num) {
        // num为1时, 方法返回1. 相当于是方法的出口, num总有是1的情况
        if (num == 1) {
            return 1;
        }
        
        // num不为1时, 方法返回num + (num - 1) 的累和, 递归调用getSum方法
        return num + getSum(num - 1);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

代码执行图解

在这里插入图片描述

注: 递归一定要有条件限定, 保证递归能够停止下来, 次数不要太多, 否则回发生栈内存溢出.

递归求阶乘

阶乘: 所有小于等于该数的正整数的乘积.

n的阶乘:n! = n * (n‐1) *...* 3 * 2 * 1

  
 
  • 1

分析

分析: 这与累和类似, 只不过换成了乘法运算. 需要注意阶乘值符合 int 类型的范围.

推理得出:n! = n * (n‐1)!

  
 
  • 1

代码展示

public class Test {
    public static void main(String[] args) {
        // 计算n的阶乘, 使用递归完成
        int n = 3;
        // 调用求阶乘的方法
        int value = getValue(n);
    }

    /**
     * 通过递归算法实现
     *
     * @param n 相乘的数字
     * @return 返回总和
     */
    private static int getValue(int n) {
        // 1的阶乘为1
        if (n == 1) {
            return 1;
        }
        
        // n不为1时, 方法返回 n! = n * (n - 1)
        return n * getValue(n - 1);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

递归打印多级目录

分析

分析: 多级目录的打印, 就是目录的嵌套. 遍历之前, 无从知道到底多少级目录. 所以我们还是要使用递归实现.

代码展示

import java.io.File;

public class Test {
    public static void main(String[] args) {
        // 创建File对象
        File dir = new File("C:/Program Files/Java/jdk-9.0.4");
        // 调用打印目录的方法
        printDir(dir, 0);
    }

    public static void printDir(File dir, int level) {
        // 获取子文件和目录
        File[] files = dir.listFiles();

        // 循环打印. 当是文件时, 打印绝对路径. 当是目录时, 继续调用打印目录的方法, 形成递归调用
        for (File file : files) {
            StringBuilder tab = new StringBuilder();
            for (int i = 0; i < level; i++) {
                tab.append("\t");
            }
            // 判断
            if (file.isFile()) {
                // 是文件, 输出文件绝对路径
                System.out.println(tab + "文件名:" + file.getAbsolutePath());
            } else {
                // 是目录, 输出目录绝对路径
                System.out.println(tab + "目录: " + file.getAbsolutePath());
                // 继续遍历, 调用printDir, 形递归
                printDir(file, level + 1);
            }
        }
    }
}

输出结果:
目录: C:\Program Files\Java\jdk-9.0.4\bin
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-console-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-datetime-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-debug-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-errorhandling-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-file-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-file-l1-2-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-file-l2-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-handle-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-heap-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-interlocked-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-libraryloader-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-localization-l1-2-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-memory-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-namedpipe-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-processenvironment-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-processthreads-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-processthreads-l1-1-1.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-profile-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-rtlsupport-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-string-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-synch-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-synch-l1-2-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-sysinfo-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-timezone-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-core-util-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-conio-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-convert-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-environment-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-filesystem-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-heap-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-locale-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-math-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-multibyte-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-private-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-process-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-runtime-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-stdio-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-string-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-time-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\api-ms-win-crt-utility-l1-1-0.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\appletviewer.exe
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\attach.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\awt.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\bci.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\cmm.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\concrt140.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\dcpr.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\decora_sse.dll
	文件名:C:\Program Files\Java\jdk-9.0.4\bin\deploy.dll
	目录: C:\Program Files\Java\jdk-9.0.4\bin\dtplugin
		文件名:C:\Program Files\Java\jdk-9.0.4\bin\dtplugin\deployJava1.dll
		文件名:C:\Program Files\Java\jdk-9.0.4\bin\dtplugin\npdeployJava1.dll

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/111588714

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。