三十八、递归

一、递归的概述

递归,指在当前方法内调用自己的这种现象。

public void method(){
    System.out.println(“递归的演示”);
    //在当前方法内调用自己
    method();
}

递归分为两种,直接递归和间接递归。

  • 直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
    递归的代码演示,计算1-n之间的和,使用递归完成:
public class DiGuiDemo {
    public static void main(String[] args) {
        //计算1~num的和,使用递归完成
        int n = 5;
        int sum = getSum(n);
        System.out.println(sum);
        
    }
    public static int getSum(int n) {
        if(n == 1){
            return 1;
        }
        return n + getSum(n-1);
    }
}

代码执行流程图解


递归图.png

注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。

二、递归打印所有子目录中的文件路径

编写一个方法用来打印指定目录中的文件路径,并进行方法的调用
要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来
步骤:

  1. 指定要打印的目录File对象
  2. 调用getFileAll()方法
    2.1 获取指定目录中的所有File对象
    2.2 遍历得到每一个File对象
    2.3 判断当前File 对象是否是目录
    判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
    判断结果为false,说明是文件,打印文件的路径
    代码演示:
public class FileDemo2 {
    public static void main(String[] args) {
        File file = new File("d:\\test");
        getFileAll(file);
    }
    //获取指定目录以及子目录中的所有的文件
    public static void getFileAll(File file) {
        File[] files = file.listFiles();
        //遍历当前目录下的所有文件和文件夹
        for (File f : files) {
            //判断当前遍历到的是否为目录
            if(f.isDirectory()){
                //是目录,继续获取这个目录下的所有文件和文件夹
                getFileAll(f);
            }else{
                //不是目录,说明当前f就是文件,那么就打印出来
                System.out.println(f);
            }
        }
    }
}


三、搜索指定目录中的.java文件(含子目录)

  • 需求1:打印指定目录即所有子目录中的.java文件的文件路径
  • 要求2:编写一个方法用来打印指定目录中的.java文件路径,并进行方法的调用,若指定的目录有子目录,那么把子目录中的.java文件路径也打印出来
    步骤:
    1. 指定要打印的目录File对象
    2. 调用getFileAll()方法,传入要打印的目录File对象
      2.1 通过FilenameFilter过滤器获取指定目录中的所有.java类型的File对象与子目录
      2.2 遍历得到每一个File对象
      2.3 判断当前File 对象是否是目录
      判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
      判断结果为false,说明是文件,打印文件的路径

实现代码步骤:
测试类

public class FileDemo4 {
    public static void main(String[] args) {
        File file = new File("d:\\test");
        getFileAll(file);
    }
    //获取指定目录以及子目录中的所有的文件
    public static void getFileAll(File file) {
        File[] files = file.listFiles(new MyFileFilter());
        //遍历当前目录下的所有文件和文件夹
        for (File f : files) {
            //判断当前遍历到的是否为目录
            if(f.isDirectory()){
                //是目录,继续获取这个目录下的所有文件和文件夹
                getFileAll(f);
            }else{
                //不是目录,说明当前f就是文件,那么就打印出来
                System.out.println(f);
            }
        }
    }
}

自定类继承FilenameFilter过滤器接口

//定义类实现文件名称FilenameFilter过滤器
class MyFileFilter implements FilenameFilter{
    public boolean accept(File dir, String name) {
        //获取当前目录下所有的.java文件 与所有的子文件夹
        //判断名字是否为.java结尾
        boolean flag = pathname.getName().endsWith(".java");
        //判断是否为文件夹
        boolean flag2 = pathname.isDirectory();
        return flag || flag2;
    }
}

你可能感兴趣的:(三十八、递归)