递归---Day29
递归的概述
递归:指在当前方法内自己调用自己的方式叫做递归
递归的分类:
1.直接递归称为方法自身调用自己。
2.间接递归可以用A方法调用B方法,用B方法调用C方法,用C方法调用A方法。
递归的注意事项
递归一定要有限定条件,保证递归能够停止下来,否则会出现死循环,导致发生栈内存溢出。 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。 构造方法,禁止递归
1 package demosummary.recursive;
2
3 public class RecursiveDemo1 {
4 public static void main(String[] args) {
5 //调用a方法
6 a(1);
7 //调用b方法
8 b();
9 }
10
11 private static void a(int i) {
12 System.out.println(i);
13 //添加一个条件避免发生内存溢出现象
14 if (i == 10) {
15 return;
16 }
17 a(++i);
18 }
19
20 //没有限制条件,会发生内存溢出现象
21 private static void b() {
22 System.out.println("b方法");
23 b();
24 }
25 }
递归累加求和
1 package demosummary.recursive;
2
3 /**
4 * 计算1~n的和
5 * 分析:
6 * num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用
7 */
8 public class RecursiveSum {
9 public static void main(String[] args) {
10 int sum = getSum(5);
11 System.out.println(sum);
12 }
13
14 private static int getSum(int num) {
15 if (num == 1) {
16 return 1;
17 }
18 return num+getSum(num -1);
19 }
20 }
递归求阶乘(同求和一样解法)
1 package demosummary.recursive;
2
3 public class RecursiveFactorial {
4 public static void main(String[] args) {
5 int sum = getSum(5);
6 System.out.println(sum);
7 }
8
9 private static int getSum(int num) {
10 //当num=1时,停止递归,防止发生内存溢出现象
11 if (num == 1) {
12 return 1;
13 }
14 return num * getSum(num - 1);
15 }
16 }
递归打印多级目录
1 package demosummary.recursive;
2
3 import java.io.File;
4
5 public class RecursivePrintDir {
6 public static void main(String[] args) {
7 //创建File对象
8 File file = new File(".//filter");
9 //调用打印方法
10 printDir(file);
11 }
12
13 private static void printDir(File dir) {
14 //获取目录的集合
15 File[] files = dir.listFiles();
16 //循环打印目录
17 for (File file : files) {
18 if (file.isFile()) {//判断是否为文件
19 System.out.println("文件的路径:" + file.getAbsolutePath());
20 } else {//判断是否为目录
21 System.out.println("目录的路径:" + file.getAbsolutePath());
22 //是目录则继续往下打印
23 printDir(file);
24 }
25 }
26 }
27 }