Java 递归的简单学习与理解
递归概述
概念:指在当前方法内调用自己的这种现象。
递归的分类:递归分为两种,直接递归和间接)递归。
- 直接递归称为方法自身调用自己
- 间接递归可以A方法调用B方法,B方法调用方法,C方法调用A方法。
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出。
- 构造方法,禁止递归。
假如有方法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的文件
本文来自博客园,作者:LeeHua,转载请注明原文链接:https://www.cnblogs.com/liyihua/p/12247390.html