Java基础 第四节 第九课
【摘要】
递归
概述递归累加求和分析代码展示代码执行图解
递归求阶乘分析代码展示
递归打印多级目录分析代码展示
概述
递归: 指在当前方法内调用自己的这种现象.
递归的分类: 递归分为...
概述
递归: 指在当前方法内调用自己的这种现象.
递归的分类: 递归分为两种, 直接递归和间接递归:
- 直接递归称为方法自身调用自己
- 间接递归可以 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)