从0学开发笔记-递归

1. 递归栈内存溢出原理

package day01;
/*
    递归:方法自己调用自己
    - 递归的分类:
        - 递归分为两种,直接递归和间接递归
        - 直接递归称为方法自身调用自己
        - 简介递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
    - 注意事项:
        - 递归一定要有条件限定,保证递归能够停下来,否则会发生栈内存溢出
        - 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生内存溢出
        - 构造方法,禁止递归
    递归使用前提:
        当调用方法的时候,方法的主体不变,每次调用方法参数不同,可以使用递归
 */
public class Dmeo01Recurison {
    
}

在这里插入图片描述

2. 递归计算1-n之间的和

package day01;
/*
    练习:
        使用递归计算1-n之间的和
 */
public class Demo02Recurison {
    public static void main(String[] args) {
        System.out.println(sum(3));
    }

/*
    定义一个方法,使用递归计算1-n之间的和
    1+2+3+...+n
    n+(n-1)+(n-2)+...+1
    已知:
        最大值:n
        最小值:1
    使用递归必须明确:
        1.递归的结束条件
            获取到1的时候结束
        2.递归的目的
            获取下一个被加的数字(n-1)
 */
public static int sum(int n) {
    //获取到1的时候结束
    if (n == 1) {
        return 1;
    }

    //获取下一个被加的数字(n-1)
    return n + sum(n-1);
}
}

在这里插入图片描述

递归1-n的阶乘

package day01;
/*
    联系:
        使用递归计算阶乘
        n的阶乘:n! = n*(n-1)*(n-2)*...*3*2*1
        5的阶乘
 */
public class Demo03Recurison {
    public static void main(String[] args) {
        System.out.println(jc(5));
    }

    public static int jc(int n){
        if (n==1){
            return 1;
        }

        return n*jc(n-1);
    }

}

递归遍历多级文件

在这里插入图片描述

package day01;

import java.io.File;

import static day01.Demo04Recurison.getAllFile;

public class Demo04Recurison {
    public static void main(String[] args) {
        File file = new File("D:\\liuqian\\java_project\\src");
        getAllFile(file);
    }

    public static void getAllFile(File file){
        File[] f = file.listFiles();
        for (File file1 : f) {
            if (file1.isDirectory()){
                //file1 是一个文件夹,则继续遍历这个文件夹
                //我们发现getFileAll方法就是传递文件夹,遍历文件夹的方法
                //所以直接调用getFileAll方法即可:递归(自己调用自己)
                getAllFile(file1);
            }else{
                System.out.println(file1);
            }
        }
    }
}
package day02;

import java.io.File;
/*
    练习:
        递归打印多级目录
    需求:
        遍历c:\\abc文件夹,及abc文件夹的子文件
        只要。java结尾的文件
 */
public class Demo01Recurison {
    public static void main(String[] args) {
        File file = new File("D:\\liuqian\\java_project\\src");
        getAllFile(file);
    }

    public static void getAllFile(File file){
        File[] f = file.listFiles();
        for (File file1 : f) {
            if (file1.isDirectory()){
                //file1 是一个文件夹,则继续遍历这个文件夹
                //我们发现getFileAll方法就是传递文件夹,遍历文件夹的方法
                //所以直接调用getFileAll方法即可:递归(自己调用自己)
                getAllFile(file1);
            }else{
                String s = file1.toString();
                boolean b = s.endsWith(".java");
                if (b){
                    System.out.println(file1);
                }

            }
        }
    }
}

文件过滤器

在这里插入图片描述

package day02;

import java.io.File;

/*
    需求:
        遍历D:\liuqian\java_project\src文件夹,及abc文件夹的子文件夹
        只要.java结尾的文件

        我们可以使用过滤器实现
        在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器
        File[] ListFiles(FileFilter filter)
        java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。
            作用:用来过滤文件(File对象)
            抽象方法:用来过滤文件的方法
                boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
                参数:
                    File pathname:使用ListFiles方法遍历目录,得到的没有给文件对象
        File[] listFiles(FilenameFilter filter)
        java,io.FilenameFilter接口:实现此接口的类实例可以用于过滤器文件名
            作用:过滤文件名称
            抽象方法:用来过滤文件的方法
                boolean accept(File dir,String name) 测试指定文件是否应该包含在某一文件列表中
                参数:
                    File dir:构造方法中传递的被遍历的目录
                    String name :使用ListFiles方法遍历目录,获取没有给文件/文件夹的名称
       注意:
            两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则

 */
public class Demo01Filter {
    public static void main(String[] args) {
        File file = new File("D:\\liuqian\\java_project\\src");
        getAllFile(file);
    }

    public static void getAllFile(File file){
        File[] f = file.listFiles(new FileFilterImpl());
        for (File file1 : f) {
            if (file1.isDirectory()){
                //file1 是一个文件夹,则继续遍历这个文件夹
                //我们发现getFileAll方法就是传递文件夹,遍历文件夹的方法
                //所以直接调用getFileAll方法即可:递归(自己调用自己)
                getAllFile(file1);
            }else{
                String s = file1.toString();
                boolean b = s.endsWith(".java");
                if (b){
                    System.out.println(file1);
                }

            }
        }
    }


}
package day02;

import java.io.File;
import java.io.FileFilter;

public class FileFilterImpl implements FileFilter{
    @Override
    public boolean accept(File pathname){
        /*
            过滤规则:
                在accept方法中,判断File对象是否以.java结尾
                是就返回true
                不是就返回false
         */
        //如果pathname是一个文件夹,返回true,继续遍历这个文件夹
        if (pathname.isDirectory()){
            return  true;
        }
        return pathname.getName().toLowerCase().endsWith(".java");
    }
}
package day02;

import java.io.File;
import java.io.FilenameFilter;

/*
    需求:
        遍历D:\liuqian\java_project\src文件夹,及abc文件夹的子文件夹
        只要.java结尾的文件

        我们可以使用过滤器实现
        在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器
        File[] ListFiles(FileFilter filter)
        java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。
            作用:用来过滤文件(File对象)
            抽象方法:用来过滤文件的方法
                boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
                参数:
                    File pathname:使用ListFiles方法遍历目录,得到的没有给文件对象
        File[] listFiles(FilenameFilter filter)
        java,io.FilenameFilter接口:实现此接口的类实例可以用于过滤器文件名
            作用:过滤文件名称
            抽象方法:用来过滤文件的方法
                boolean accept(File dir,String name) 测试指定文件是否应该包含在某一文件列表中
                参数:
                    File dir:构造方法中传递的被遍历的目录
                    String name :使用ListFiles方法遍历目录,获取没有给文件/文件夹的名称
       注意:
            两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则

 */
public class Demo02Filter {
    public static void main(String[] args) {
        File file = new File("D:\\liuqian\\java_project\\src");
        getAllFile(file);
    }

    public static void getAllFile(File file){
        //使用匿名内部类
        File[] f = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                // 过滤规则,pathname是文件夹或者是.java结尾的文件返回true
                return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");  //这里是listFiles返回file中的所有文件夹,再利用过滤器里里面的抽象方法过滤
            }
        });


        for (File file1 : f) {
            if (file1.isDirectory()){
                //file1 是一个文件夹,则继续遍历这个文件夹
                //我们发现getFileAll方法就是传递文件夹,遍历文件夹的方法
                //所以直接调用getFileAll方法即可:递归(自己调用自己)
                getAllFile(file1);
            }else{
                String s = file1.toString();
                boolean b = s.endsWith(".java");
                if (b){
                    System.out.println(file1);
                }

            }
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值