Java 递归的简单学习与理解

递归概述

概念:指在当前方法内调用自己的这种现象。

递归的分类:递归分为两种,直接递归和间接)递归。

  1. 直接递归称为方法自身调用自己
  2. 间接递归可以A方法调用B方法,B方法调用方法,C方法调用A方法。

注意事项:

  1. 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
  2. 在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出。
  3. 构造方法,禁止递归。

假如有方法A,没有限制,不断的递归A方法,那么分配的栈内存中就有无数个A方法,最终导致栈内存溢出。构造方法中不可以递归,因为构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接编译报错。

使用递归计算1~n之间的和

public class DemoSum {
    public static void main(String[] args) {
        System.out.println(sum(100));
    }

    public static int sum(int n) {
        if (n == 1) {
            return 1;
        }
        return n + sum(n - 1);
    }

}
控制台输出:
5050

使用递归来计算n的阶乘

public class DemoFactorial {
    public static void main(String[] args) {
        System.out.println(sum(10));
    }

    public static int sum(int n) {
        if (n > 1) {
            return n * sum(n - 1);
        }
        return 1;
    }
}
控制台输出:
3628800

递归打印多级目录下的文件

import java.io.File;

public class DemoFileAndDirectory {
    public static void main(String[] args) {
        File file = new File("/AAA/BBB/CCC/");
        ergodic(file);
    }

    /**
     * 遍历输出文件夹下的的文件,倘若给定的是一个文件,直接输出该文件
     * @param file 文件或文件夹
     */
    public static void ergodic(File file) {
        // 是否存在该目录或文件
        if (file.exists()) {
            // 存在该目录或文件,获取该目录下的所有目录和文件
            File[] files = file.listFiles();
            // 遍历该目录下的文件或目录
            for (File f : files) {
                // 该目录下,如果是目录,使用递归。如果是文件,直接输出。
                if (f.isDirectory()) {
                    ergodic(f);
                } else {
                    System.out.println(f.getAbsolutePath());
                }
            }
        } else {
            if (file.isFile()) {
                System.out.println("不存在该文件");
            } else {
                System.out.println("不存在该目录");
            }
        }
    }
}
控制台输出:
不存在该目录

递归打印多级目录下的.java文件

import java.io.File;

public class Demo02FileAndDirectory {
    public static void main(String[] args) {
        File file = new File("/Users/liyihua/IdeaProjects/Study/src/view/study");
        ergodic(file);
    }

    /**
     * 遍历输出文件夹下的的.java文件,倘若给定的是一个文件,且是.java为后缀的文件,直接输出该文件
     * @param file 文件或文件夹
     */
    public static void ergodic(File file) {
        // 是否存在该目录或文件
        if (file.exists()) {
            // 存在该目录或文件,获取该目录下的所有目录和文件
            File[] files = file.listFiles();
            // 遍历该目录下的文件或目录
            assert files != null;
            for (File f : files) {
                // 该目录下,如果是目录,使用递归。如果是文件,直接输出。
                if (f.isDirectory()) {
                    ergodic(f);
                } else if (f.getName().endsWith(".java")) {
                    System.out.println(f.getName());
                }
            }
        } else {
            if (file.isFile()) {
                System.out.println("不存在该文件");
            } else {
                System.out.println("不存在该目录");
            }
        }
    }
}
控制台输出所有后缀名为java的文件
posted @ 2020-02-01 01:42  LeeHua  阅读(571)  评论(0编辑  收藏  举报