递归

递归
概述

递归:指的是当前方法调用自己的一种现象。

递归的分类:

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

直接递归:称为方法自身调用自己的情况

间接递归:可以归结为:方法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());
原文地址:https://www.cnblogs.com/lulubenlei/p/14136738.html