递归

递归的定义

指在当前方法中自己调用自己的情况

递归的分类

递归分为两种:直接递归和间接递归

  • 直接递归:方法直接调用自己
  • 间接递归:A方法调用B方法,B方法调用C方法,C方法调用A方法,这种不直接调用自己的递归,称为间接递归。

递归的注意事项

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

递归遍历多级目录

为了更好理解递归,我们选定目录E:\文档,遍历其子目录及文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.example.demo;

import java.io.File;

public class FileListDemo {

public static void main(String[] args) {
File file = new File("E:\\文档");
getAllFiles(file);
}

public static void getAllFiles(File dir) {
System.out.println(dir);
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
getAllFiles(file); //递归调用
} else {
System.out.println(file);
}
}
}
}

递归遍历特定文件搜索

在这个例子中,我们需要递归搜索以.pdf结尾的文件,因此,我们在else语句中增加判断是否以.pdf结尾的文件,再打印输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.example.demo;

import java.io.File;

public class FileListDemo {

public static void main(String[] args) {
File file = new File("E:\\文档");
getAllFiles(file);
}

public static void getAllFiles(File dir) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
getAllFiles(file);
} else {
if(file.getName().endsWith(".pdf")){
System.out.println(file);
}
}
}
}
}