递归的概念 * 方法自身调用自身就称为递归 递归的分类 * 直接递归:方法A调用方法A * 间接递归:方法A调用方法B,方法B调用方法C,方法C调用方法A 使用注意事项 * 递归必须要有出口:结束递归的条件 * 递归次数不要太多 * 构造方法不能使用递归 java.lang.StackOverflowError:栈内存溢出
递归练习
求和计算
需求说明
求1到n的和。
示例代码
public static void main(String[] args) { System.out.println(sum(5)); System.out.println(sum(20)); System.out.println(sum(1)); } public static int sum(int n) { //明确递归终止的条件 if(n == 1) return 1; //分析递归逻辑 return n + sum(n-1); }
递归求阶乘
需求说明
求n的阶乘。
示例代码
public static void main(String[] args) { System.out.println(jc(5)); System.out.println(jc(20)); System.out.println(jc(1)); } public static int jc(int n) { //明确递归终止的条件 if(n == 1) return 1; //分析递归逻辑 return n * jc(n-1); }
递归方法:遍历指定文件夹的所有文件
public static void main(String[] args) { // 创建文件夹对象 File dir = new File("c:/aaa"); // 调用递归方法 printFiles(dir); } public static void printFiles(File dir){ // 获得该文件夹下的所有文件 File[] files = dir.listFiles(); // 遍历文件数组 for (File f : files) { if(f.isFile()) { // 是文件 System.out.println(f.getAbsolutePath()); } else { // 是文件夹,递归调用当前方法 printFiles(f); } } }
从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印
例如: aaa 是文件夹,里面有 bbb.txt,ccc.txt,ddd.txt
这些文件,有 eee 这样的文件夹,eee 中有 fff.txt 和 ggg.txt,打印出层级来
aaa
bbb.txt
ccc.txt
ddd.txt
eee
fff.txt
ggg.txt
public static void main(String[] args) { File file = new File("src"); printDir(file,0); } public static void printDir(File f,int level){ for (int i = 0; i < level; i++) { System.out.print("\t"); } System.out.println(f.getName()); if(f.isDirectory()) { File[] files = f.listFiles(); for (File file : files) { printDir(file,level + 1); } }
键盘录入一个文件夹路径,删除该路径下的文件夹。要求:文件夹中包含有子文件夹
public static void main(String[] args) { // 获得文件夹对象 File dir = inputFile(); // 删除文件夹 delete(dir); } /* * 根据用户输入的路径字符串创建文件对象 */ private static File inputFile() { // 创建键盘输入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入一个文件夹路径:"); // 接收用户输入的路径 String filePath = sc.nextLine(); // 根据路径字符串创建文件对象 File dir = new File(filePath); if(!dir.exists()) throw new RuntimeException("你输入的文件路径不存在!!!"); // 判断是否是文件夹 if(!dir.isDirectory()){ throw new RuntimeException("输入的路径不是文件夹路径!!!"); } return dir; } /* * 删除文件夹 */ public static void delete(File dir) { // 获取所有文件 File[] files = dir.listFiles(); // 遍历子目录,删除子目录 for (File file : files) { if (file.isFile()) { boolean success = file.delete(); // 判断是否删除成功,主要用于测试自己写的代码 if (success) { System.out.println(file + "删除成功"); } else { System.out.println(file + "正在使用,删除失败"); } } else { // 如果是文件夹递归删除 delete(file); } } // 来到这里说明,该文件夹为空了. boolean success = dir.delete(); // 判断是否删除成功,主要用于测试自己写的代码 if (success) { System.out.println(dir + "删除成功"); } else { System.out.println(dir + "正在使用,删除失败"); } }