递归

递归

递归的概念
    * 方法自身调用自身就称为递归 

递归的分类
    * 直接递归:方法A调用方法A
    * 间接递归:方法A调用方法B,方法B调用方法C,方法C调用方法A
    
使用注意事项
    * 递归必须要有出口:结束递归的条件
    * 递归次数不要太多
    * 构造方法不能使用递归

java.lang.StackOverflowError:栈内存溢出

递归练习

求和计算

  • 需求说明

    • 求1到n的和。

  • 示例代码


    public static void main(String[] args) {
        System.out.println(sum(5)); 
        System.out.println(sum(20)); 
        System.out.println(sum(1)); 
    }
    
    public static int sum(int n) {
        //明确递归终止的条件
        if(n == 1) return 1;
        //分析递归逻辑
        return n + sum(n-1);
        
    }

递归求阶乘

  • 需求说明

    • 求n的阶乘。

  • 示例代码


    public static void main(String[] args) {
        System.out.println(jc(5)); 
        System.out.println(jc(20)); 
        System.out.println(jc(1)); 
    }
    
    public static int jc(int n) {
        //明确递归终止的条件
        if(n == 1) return 1;
        //分析递归逻辑
        return n * jc(n-1);
    }

递归方法:遍历指定文件夹的所有文件
public static void main(String[] args) {
        // 创建文件夹对象
        File dir = new File("c:/aaa");
        // 调用递归方法
        printFiles(dir);
    }
    
    
    public static void printFiles(File dir){
        // 获得该文件夹下的所有文件
        File[] files = dir.listFiles();
        // 遍历文件数组
        for (File f : files) {
            if(f.isFile()) { // 是文件
                System.out.println(f.getAbsolutePath());
            } else { // 是文件夹,递归调用当前方法
                printFiles(f);
            }
        }
    }

  • 从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印
  • 例如: aaa 是文件夹,里面有 bbb.txt,ccc.txt,ddd.txt

  • 这些文件,有 eee 这样的文件夹,eee 中有 fff.txt 和 ggg.txt,打印出层级来

  • aaa

    • bbb.txt

    • ccc.txt

    • ddd.txt

    • eee

      • fff.txt

      • ggg.txt

    public static void main(String[] args) {
        File file = new File("src");
        
        printDir(file,0);

    }

    public static void printDir(File f,int level){
        
        for (int i = 0; i < level; i++) {
            System.out.print("\t");
        }
        
        System.out.println(f.getName());
        
        if(f.isDirectory()) {
            File[] files = f.listFiles();
            for (File file : files) {
                printDir(file,level + 1);
            }
        } 
        

键盘录入一个文件夹路径,删除该路径下的文件夹。要求:文件夹中包含有子文件夹
public static void main(String[] args) {
        // 获得文件夹对象
        File dir = inputFile();
        // 删除文件夹
        delete(dir);
    }
    
    /*
     * 根据用户输入的路径字符串创建文件对象
     */
    private static File inputFile() {
        // 创建键盘输入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件夹路径:");
        // 接收用户输入的路径
        String filePath = sc.nextLine();
        // 根据路径字符串创建文件对象
        File dir = new File(filePath);
        if(!dir.exists()) throw new RuntimeException("你输入的文件路径不存在!!!");
        // 判断是否是文件夹
        if(!dir.isDirectory()){
            throw new RuntimeException("输入的路径不是文件夹路径!!!");
        }
        return dir;
    }
    
    /*
     * 删除文件夹
     */
    public static void delete(File dir) {
        // 获取所有文件
        File[] files = dir.listFiles();
        // 遍历子目录,删除子目录
        for (File file : files) {
            if (file.isFile()) {
                boolean success = file.delete();
                // 判断是否删除成功,主要用于测试自己写的代码
                if (success) {
                    System.out.println(file + "删除成功");
                } else {
                    System.out.println(file + "正在使用,删除失败");
                }
            } else {
                // 如果是文件夹递归删除
                delete(file);
            }
        }

        // 来到这里说明,该文件夹为空了.
        boolean success = dir.delete();
        // 判断是否删除成功,主要用于测试自己写的代码
        if (success) {
            System.out.println(dir + "删除成功");
        } else {
            System.out.println(dir + "正在使用,删除失败");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值