09_0_2_递归

递归概述

package com.itheima.demo02.Recursion;

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

 */
public class Demo01Recursion {
    public static void main(String[] args) {
//        a();
//        b(1);

    }

    /*
        构造方法,禁止递归
            编译报错,构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接编译报错
     */
    public Demo01Recursion() {
//        Demo01Recursion();
    }

    /*
         在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
     */
    private static void b(int i) {
        System.out.println(i);
        if (i == 10000) {
            return;//结束方法
        }
        b(++i);
    }

    /*
         递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。java.lang.StackOverflowError

     */
    private static void a() {
        System.out.println("a方法!");
        a();
    }
}

栈内存溢出异常

递归导致栈内存溢出的原理

递归累加和

package com.itheima.demo02.Recursion;

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

    /*
        定义一个方法,使用递归计算1-n之间的和
        已知:
            最大值: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);
    }
}

递归求和原理

递归求阶乘

package com.itheima.demo02.Recursion;

public class Demo03Recursion {
    public static void main(String[] args) {
        int s = sum(5);
        System.out.println(s);
    }

    /*
        定义一个方法,使用递归计算1-n之间的乘积
        已知:
            最大值: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);
    }
}

递归打印多级目录

package com.itheima.demo02.Recursion;

import java.io.File;

/*
    练习:
        递归打印多级目录
 */
public class Demo04Recursion {
    public static void main(String[] args) {
        File f1 = new File("C:\\Users\\Ao\\Desktop\\lolhfds");
        getAllFile(f1);
    }

    /*
        定义一个方法,参数传递File类型的目录
        方法中对目录进行遍历
     */
    private static void getAllFile(File f1) {
        System.out.println(f1);
        File[] files = f1.listFiles();
        for (File f : files) {
            //对遍历得到的File对象进行f进行判断,判断是否是文件夹
            if (f.isFile()) {
                //f是文件,直接打印即可
                System.out.println(f);
            } else {
                //f是一个文件夹,则继续遍历这个文件夹
                //我们发现getAllFile()就是传递文件夹,遍历文件夹的方法
                //所以直接调用getAllFile()即可,递归
                getAllFile(f);
            }
        }

    }


}

递归遍历多级目录

文件搜索(以后缀名搜素)

package com.itheima.demo02.Recursion;

import java.io.File;

/*
    练习:
        递归打印多级目录
    需求:
        只要.jpg结尾的文件
 */
public class Demo05Recursion {
    public static void main(String[] args) {
        File f1 = new File("C:\\Users\\Ao\\Desktop\\lolhfds");
        getAllFile(f1);
    }

    /*
        定义一个方法,参数传递File类型的目录
        方法中对目录进行遍历
     */
    private static void getAllFile(File f1) {
        File[] files = f1.listFiles();
        for (File f : files) {
            //对遍历得到的File对象进行f进行判断,判断是否是文件夹
            if (f.isFile()) {
                /*
                    C:\\abc\\abc.txt
                    只要.jpg结尾的文件
                    1.把File对象转化为字符串对象
                        String name = f.getName();//abc.txt
                        String path = f.getPath();//C:\\abc\\abc.txt
                        String s = f.toString();//C:\\abc\\abc.txt
                    2.调用String类中的方法endsWith判断字符串是否以.jpg结尾

                //1.把File对象转化为字符串对象
                String name = f.getName();//abc.txt
                name = name.toLowerCase();
                //2.调用String类中的方法endsWith判断字符串是否以.jpg结尾
                if(name.endsWith(".jpg")){
                    System.out.println(f);
                }
                */
                if (f.getName().toLowerCase().endsWith(".jpg")) {
                    System.out.println(f);
                }
            } else {
                //f是一个文件夹,则继续遍历这个文件夹
                //我们发现getAllFile()就是传递文件夹,遍历文件夹的方法
                //所以直接调用getAllFile()即可,递归
                getAllFile(f);
            }
        }

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值