Java递归-recursion

  1. 递归

   递归(recursion)做为一种算法在程序设计语言中广泛应用。是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象。

   (自己调用自己,有结束条件)

   注意:递归时一定要明确结束条件。

数学中递归运算.

   对于任何正整数N ,N! (读作N的阶乘)的值定义为1-N(包括N)的所有的整数的成绩.因此3! 就是 3!=3*2*1 =6;

5! 定义为5!=5*4*3*2*1=120

那么整数N 的阶乘 N! 可以表示为

1!=1

N!=N*(N-1)! for N>1

若果N 等于1 那么1的继承就是1,其他所有N! =N*(N-1)!,例如:50!=50*49!

49!=49*48! 48!=48*47! 一直持续到1出现.

如何使用Java程序计算阶乘?

    public static long recursion(int n) {

        if (n == 1) {

            return 1;

        } else {

            return n * recursion(n - 1);

        }

    }

    1. 案例

   1,列出指定目录中所有的子孙文件与子孙目录名,只需要列出名称即可。

   2,列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:

      第一级前面有0个,第二级前面有1个,第三级前面有2个...,以此类推。

   3,列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构,效果如下所示:

      |--src

      |   |--cn

      |   |   |--ittest

      |   |   |   |--a_helloworld

      |   |   |   |   |--HelloWorld.java

      |   |   |   |--b_for

      |   |   |   |   |--ForTest.java

      |   |   |   |--c_api

      |   |   |   |   |--Student.java

      |--bin

      |   |--cn

      |   |   |--ittest

      |   |   |   |--i_exception

      |   |   |   |   |--ExceptionTest.class

      |   |   |   |--h_linecount

      |   |   |   |   |--LineCounter3.class

      |   |   |   |   |--LineCounter2.class

      |   |   |   |   |--LineCounter.class

      |--lib

      |   |--commons-io.jar

答案:

案例一:

// 1,列出指定目录中所有的子孙文件与子孙目录名,只需要列出名称即可。

    private static void listFile(File file) {

        File[] listFiles = file.listFiles();

        for (File f : listFiles) {

            if (f.isFile()) {

                System.out.println(f.getName());

            } else if (f.isDirectory()) {

                System.out.println(f.getName());

                listFile(f);

            }

        }

    }

public static void main(String[] args) {

        File file = new File("c:\\abc");

         listFile(file);

    }

案例二

// 2,列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:

    private static void listFile2(File file, String str) {

        File[] listFiles = file.listFiles();

        for (int i = 0; i < listFiles.length; i++) {

            File f = listFiles[i];

            System.out.println(str + f.getName());

            if (f.isDirectory()) {

                listFile2(f, str + "-");

            }

        }

    }

public static void main(String[] args) {

        File file = new File("c:\\abc");

        String str = "-";

        listFile2(file, str);

案例三:

// 列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构

    private static void listFile3(File file, String str) {

        File[] listFiles = file.listFiles();

        for (File f : listFiles) {

            System.out.println(str + f.getName());

            if (f.isDirectory()) {

                listFile3(f, "|  " + str);

            }

        }

    }

public static void main(String[] args) {

        File file = new File("c:\\abc");

        file = new File("c:\\day18ide");

        file = new File("c:\\MyIo");

        str = "|-";

        listFile3(file, str);

    1. 练习

   1,删除一个非空的目录。

   2,移动一个非空的目录到另一个地方(剪切)。   

   3,把File类中的重要方法设计代码测试一遍。

// 1,删除一个非空的目录。并加强健壮性

    private static void deleteFile(File file) {

        if (!file.exists()) {

            System.out.println("路径不存在");

            return;

        }

        if (!file.isDirectory()) {

            System.out.println("不是目录");

            return;

        }

        // 如果当前目录中有子目录和文件,先删除子目录和文件

        File[] listFiles = file.listFiles();

        for (File f : listFiles) {

            if (f.isFile()) {

                f.delete();

            } else if (f.isDirectory()) {

                deleteFile(f);

            }

        }

        // 删除当前目录

        file.delete();

    }

练习2:

使用File类的renameTo 方法和递归实现非空目录的剪切.

public static void main(String[] args) throws IOException {

        // 重命名文件(成功)

        // File src = new File("c:\\aaa.txt");

        // File dest = new File("c:\\bbb.txt");

        // src.renameTo(dest);

        // //移动文件(成功)

        // File src = new File("c:\\aaa.txt");

        // File dest = new File("d:\\aaa.txt");

        // src.renameTo(dest);

        // 移动一个空目录(失败)

        // File src = new File("c:\\aaa");

        // File dest = new File("d:\\aaa");

        // System.out.println(src.renameTo(dest));

        // 使用File类和递归实现文件的剪切.

        File src = new File("c:\\abc");

        File dest = new File("d:\\");

        cutFile(src, dest);

    }

    // 移动一个非空的目录到另一个地方(剪切)。

    private static void cutFile(File srcDir, File dest) throws IOException {

        if (!srcDir.exists() || !dest.exists()) {

            System.out.println("指定的源目录或者目标目录不存在");

            return;

        }

        if (!srcDir.isDirectory() || !dest.isDirectory()) {

            System.out.println("指定的源目录或者目标目录不是目录");

            return;

        }

        // 得到源目录名

        String srcDirName = srcDir.getName(); // abc

        // 根据源目录名创建新目录名

        File destDir = new File(dest + srcDirName); // d:\\abc dest 为父路径

                                                    // srcDirName 为子路径

        // 创建目标目录

        destDir.mkdir();

        // 遍历源目录

        File[] listFiles = srcDir.listFiles();

        for (File f : listFiles) {

            // 如果是子源文件,使用renameTo方法,移动至目标目录中(该方法同时会删除源目录中的文件)

            if (f.isFile()) {

                f.renameTo(new File(destDir, f.getName())); // 指定目标文件的父目录,文件名(根据源文件名生成).

            } else if (f.isDirectory()) {

                // 如果是子目录,执行重复动作. 将源子目录 , 目标目录(父目录+//)

                cutFile(f, new File(destDir, File.separator)); // 指定源目录,指定目的路径d:\\abc\\

            }

        }

        // 删除源目录

        srcDir.delete();

    }

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

棉花糖老丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值