8.2 递归
8.2.1 概述
- 递归:指在当前方法内调用自己的这种现象。
- 递归的分类:
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
- 注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归
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
| public class Demo01DiGui { public static void main(String[] args) { b(1); }
public Demo01DiGui() { }
private static void b(int i) { System.out.println(i); if(i==5000){ return; } b(++i); }
private static void a() { System.out.println("a方法"); a(); } }
|
8.2.2 递归累加求和
计算1 ~ n的和
分析:num的累和 = num + (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 26 27 28 29
| public class DiGuiDemo { public static void main(String[] args) { int num = 5; int sum = getSum(num); System.out.println(sum); }
public static int getSum(int num) {
if(num == 1){ return 1; }
return num + getSum(num‐1); } }
|
代码执行图解

小贴士:
递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。
8.2.3 递归求阶乘
- 阶乘:所有小于及等于该数的正整数的积。
1
| n的阶乘:n! = n * (n‐1) *...* 3 * 2 * 1
|
- 分析:*这与累加类似,只不过换成了乘法运算,但需要注意阶乘值符合int类型的范围。
代码实现:
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
| public class DiGuiDemo { public static void main(String[] args) { int n = 3; int value = getValue(n); System.out.println("阶乘为:"+ value); }
public static int getValue(int n) { if (n == 1) { return 1; }
return n * getValue(n ‐ 1); } }
|
8.2.4 递归打印多级目录
分析:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。
代码实现:
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
| public class DiGuiDemo2 { public static void main(String[] args) { File dir = new File("D:\\aaa"); printDir(dir); } public static void printDir(File dir) { File[] files = dir.listFiles();
for (File file : files) { if (file.isFile()) { System.out.println("文件名:"+ file.getAbsolutePath()); } else { System.out.println("目录:"+file.getAbsolutePath()); printDir(file); } } } }
|
本文标题:第三部分 第八章 2.递归
文章作者:foreverSFJ
发布时间:2019-08-20 20:40:56
最后更新:2019-08-20 20:40:56
原始链接:Notes/Java/Basic/Part03/08_2 递归.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!