Java_IO流03_递归

1.    方法定义中调用方法本身的现象

2.    递归的注意事项;

        A:要有出口,否则就是死递归

        B:次数不能过多,否则内存溢出

        C:构造方法不能递归使用

3.    递归的案例:

        A:递归求阶乘

        B:兔子问题

        C:递归输出指定目录下所有指定后缀名的文件绝对路径

        D:递归删除带内容的目录(小心使用)

 

/**********************************************************************************************************************************************/

案例A:

 

 

/**********************************************************************************************************************************************/

案例B:

/*

* 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?

* 分析:我们要想办法找规律

*             兔子对数

* 第一个月:     1

* 第二个月:    1

* 第三个月:    2

* 第四个月:    3    

* 第五个月:    5

* 第六个月:    8

* ...

*

* 由此可见兔子对象的数据是:

*         1,1,2,3,5,8...

* 规则:

*         A:从第三项开始,每一项是前两项之和

*         B:而且说明前两项是已知的

*

* 如何实现这个程序呢?

*         A:数组实现

*         B:变量的变化实现

*         C:递归实现

*

* 假如相邻的两个月的兔子对数是a,b

* 第一个相邻的数据:a=1,b=1

* 第二个相邻的数据:a=1,b=2

* 第三个相邻的数据:a=2,b=3

* 第四个相邻的数据:a=3,b=5

* 看到了:下一次的a是以前的b,下一次是以前的a+b    

*/

public class DiGuiDemo2 {

    public static void main(String[] args) {

        // 定义一个数组

        int[] arr = new int[20];

        arr[0] = 1;

        arr[1] = 1;

        // arr[2] = arr[0] + arr[1];

        // arr[3] = arr[1] + arr[2];

        // ...

        for (int x = 2; x < arr.length; x++) {

            arr[x] = arr[x - 2] + arr[x - 1];

        }

        System.out.println(arr[19]);// 6765

        System.out.println("----------------");

 

        int a = 1;

        int b = 1;

        for (int x = 0; x < 18; x++) {

            // 临时变量存储上一次的a

            int temp = a;

            a = b;

            b = temp + b;

        }

        System.out.println(b);

        System.out.println("----------------");

 

        System.out.println(fib(20, 1));

    }

 

    /**

     *

     * @param mouth

     * 月数

     * @param num

     * 初始兔子数量

     * @return mouth 月后的兔子数量

     */

    public static int fib(int mouth, int num) {

        if (mouth == 1 || mouth == 2) {

            return num;

        } else {

            return fib(mouth - 1, num) + fib(mouth - 2, num);

        }

    }

}

/**********************************************************************************************************************************************/

案例C:

/*

* 需求:请大家把G:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台。

*

* 分析:

*         A:封装目录

*         B:获取该目录下所有的文件或者文件夹的File数组

*         C:遍历该File数组,得到每一个File对象

*         D:判断该File对象是否是文件夹

*             是:回到B

*             否:继续判断是否以.java结尾

*                 是:就输出该文件的绝对路径

*                 否:不搭理它

*/

public class FilePathDemo {

    public static void main(String[] args) {

        // 封装目录

        File srcFolder = new File("G:\\JavaSE");

 

        // 递归功能实现

        getAllJavaFilePaths(srcFolder);

    }

 

    private static void getAllJavaFilePaths(File srcFolder) {

        // 获取该目录下所有的文件或者文件夹的File数组

        File[] fileArray = srcFolder.listFiles();// 如果是根目录,有些有些受保护的文件调用该方法会返回null。自己可以加个判断,不是null再去遍历即可。

 

        // 遍历该File数组,得到每一个File对象

        for (File file : fileArray) {

            // 判断该File对象是否是文件夹

            if (file.isDirectory()) {

                getAllJavaFilePaths(file);

            } else {

                // 继续判断是否以.java结尾

                if (file.getName().endsWith(".java")) {

                    // 就输出该文件的绝对路径

                    System.out.println(file.getAbsolutePath());

                }

            }

        }

    }

}

/**********************************************************************************************************************************************/

案例D:

/*

* 需求:递归删除带内容的目录

*

* 目录我已经给定:demo

*

* 分析:

*         A:封装目录

*         B:获取该目录下的所有文件或者文件夹的File数组

*         C:遍历该File数组,得到每一个File对象

*         D:判断该File对象是否是文件夹

*             是:回到B

*             否:就删除

*/

public class FileDeleteDemo {

    public static void main(String[] args) {

        // 封装目录

        File srcFolder = new File("G:\\JavaSE");

        // 递归实现

        deleteFolder(srcFolder);

    }

 

    private static void deleteFolder(File srcFolder) {

        // 获取该目录下的所有文件或者文件夹的File数组

        File[] fileArray = srcFolder.listFiles();

 

        if (fileArray != null) {

            // 遍历该File数组,得到每一个File对象

            for (File file : fileArray) {

                // 判断该File对象是否是文件夹

                if (file.isDirectory()) {

                    deleteFolder(file);

                } else {

                    System.out.println(file.getName() + "---" + file.delete());

                }

            }

 

            System.out.println(srcFolder.getName() + "---" + srcFolder.delete());

        }else{

            System.out.println("该目录不存在!");

        }

    }

}

/**********************************************************************************************************************************************/

 

 

 

猜你喜欢

转载自www.cnblogs.com/zhaolanqi/p/9283567.html