递归
概述
递归:指的是当前方法调用自己的一种现象。
递归的分类:
递归分为两类:直接递归和间接递归
直接递归:称为方法自身调用自己的情况
间接递归:可以归结为:方法A调用了方法B,方法B调用了方法C,方法C反过来又调用了方法A。
-
注意事项:
-
递归一定要有边界条件(条件限定),保证递归能够停止下来,否则会发生栈内存溢出。
-
在递归当中虽然有限定条件,但是递归的次数也不能太多,否则也会发生栈内存溢出现象。
-
构造方法禁止递归。
示例代码:
-
递归求阶乘
阶乘:所有小于等于该数的正整数的乘积
n的阶乘:n!=n(n-1) * (n-2) * (n-3) ... * 3 * 2 * 1
public static void main(String[] args) {
int i=sum(5);
System.out.println(i);//6
}
/*
定义一个方法使用递归操作
n+(n-1)+(n+2)+(n-3)+...+1
已知:
最大值:n
最小值:1
使用递归必须明确:
1.递归的结束条件,获取到1的时候递归结束
2.递归的目的:获取下一个被加的数字(n-1)
*/
public static int sum(int n){
//边界条件
if (n==1){
return 1;
}
//获取下一个被加的数字
return n*sum(n-1);
}
综合案例
文件搜索
搜索:D:IntelliJ IDEA Community Edition 2020.2.1jbrIntelliJ IDEA Community Edition 2020.2.1license目录中的所有的.txt文件
分析:
1.目录搜索,无法判断有多少级目录,所以使用递归,遍历所有的目录
2.遍历母的时候,获取的是所有的子文件
package Demo01;
import java.io.File;
public class Demo05 {
public static void main(String[] args) {
//构建一个包
File file = new File("D:\IntelliJ IDEA Community Edition 2020.2.1\jbr\IntelliJ IDEA Community Edition 2020.2.1");
getAllTxt(file);
}
/*
定义一个方法,遍历所有的.txt文件
方法中依然需要传参数目录
*/
public static void getAllTxt(File dir){
File[] files = dir.listFiles();
//遍历files
for (File f : files) {
//判断是否是一个目录
if (f.isDirectory()){
getAllTxt(f);
}else{
/* //先获取文件的名称
String name = f.getName();
//大写字符串转换小写
name=name.toLowerCase();
//再次判断名称是否已.txt结尾
if (name.endsWith(".txt")){
System.out.println(f);
}*/
//链式编程写法
if (f.getName().toLowerCase().endsWith(".txt")){
System.out.println(f);
}
}
}
}
}
文件过滤器优化
"Java.io.FileFilter"是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)作为参数,接口只有一个方法:
“boolean accept(File pathname)”:测试pathname是否应该包含在当前的File目录中,如果符合返回true。
Lambda优化
实例代码
File[] files = file.listFiles(pathname -> pathname.getName().toLowerCase().endsWith(".txt")||pathname.isDirectory());