09

mac2024-03-11  26

递归概述

package com.itheima.demo02.Recursion; /* 递归:指在当前方法内调用自己的这种现象。 递归的分类: 递归分为两种,直接递归和间接递归。 直接递归称为方法自身调用自己。 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。 注意事项: 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。 构造方法,禁止递归 递归的使用前提: 当调用方法的时候,方法的主体不变,每次调用方法的参数不同,意义使用递归 */ public class Demo01Recursion { public static void main(String[] args) { // a(); // b(1); } /* 构造方法,禁止递归 编译报错,构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接编译报错 */ public Demo01Recursion() { // Demo01Recursion(); } /* 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。 */ private static void b(int i) { System.out.println(i); if (i == 10000) { return;//结束方法 } b(++i); } /* 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。java.lang.StackOverflowError */ private static void a() { System.out.println("a方法!"); a(); } }

栈内存溢出异常

递归导致栈内存溢出的原理

递归累加和

package com.itheima.demo02.Recursion; /* 练习: 使用递归计算1-n之间的和 */ public class Demo02Recursion { public static void main(String[] args) { int s = sum(100); System.out.println(s); } /* 定义一个方法,使用递归计算1-n之间的和 已知: 最大值:n 最小值:1 使用递归必须明确: 1递归的结束条件 获取到1时结束 2递归的目的 获取下一个被加的数字n-1 */ public static int sum(int n) { //获取到1的时候结束 if (n == 1) { return 1; } //获取下一个被加的数n-1 return n + sum(n - 1); } }

递归求和原理

递归求阶乘

package com.itheima.demo02.Recursion; public class Demo03Recursion { public static void main(String[] args) { int s = sum(5); System.out.println(s); } /* 定义一个方法,使用递归计算1-n之间的乘积 已知: 最大值:n 最小值:1 使用递归必须明确: 1递归的结束条件 获取到1时结束 2递归的目的 获取下一个被加的数字n-1 */ public static int sum(int n) { //获取到1的时候结束 if (n == 1) { return 1; } //获取下一个被乘的数n-1 return n * sum(n - 1); } }

递归打印多级目录

package com.itheima.demo02.Recursion; import java.io.File; /* 练习: 递归打印多级目录 */ public class Demo04Recursion { public static void main(String[] args) { File f1 = new File("C:\\Users\\Ao\\Desktop\\lolhfds"); getAllFile(f1); } /* 定义一个方法,参数传递File类型的目录 方法中对目录进行遍历 */ private static void getAllFile(File f1) { System.out.println(f1); File[] files = f1.listFiles(); for (File f : files) { //对遍历得到的File对象进行f进行判断,判断是否是文件夹 if (f.isFile()) { //f是文件,直接打印即可 System.out.println(f); } else { //f是一个文件夹,则继续遍历这个文件夹 //我们发现getAllFile()就是传递文件夹,遍历文件夹的方法 //所以直接调用getAllFile()即可,递归 getAllFile(f); } } } }

递归遍历多级目录

文件搜索(以后缀名搜素)

package com.itheima.demo02.Recursion; import java.io.File; /* 练习: 递归打印多级目录 需求: 只要.jpg结尾的文件 */ public class Demo05Recursion { public static void main(String[] args) { File f1 = new File("C:\\Users\\Ao\\Desktop\\lolhfds"); getAllFile(f1); } /* 定义一个方法,参数传递File类型的目录 方法中对目录进行遍历 */ private static void getAllFile(File f1) { File[] files = f1.listFiles(); for (File f : files) { //对遍历得到的File对象进行f进行判断,判断是否是文件夹 if (f.isFile()) { /* C:\\abc\\abc.txt 只要.jpg结尾的文件 1.把File对象转化为字符串对象 String name = f.getName();//abc.txt String path = f.getPath();//C:\\abc\\abc.txt String s = f.toString();//C:\\abc\\abc.txt 2.调用String类中的方法endsWith判断字符串是否以.jpg结尾 //1.把File对象转化为字符串对象 String name = f.getName();//abc.txt name = name.toLowerCase(); //2.调用String类中的方法endsWith判断字符串是否以.jpg结尾 if(name.endsWith(".jpg")){ System.out.println(f); } */ if (f.getName().toLowerCase().endsWith(".jpg")) { System.out.println(f); } } else { //f是一个文件夹,则继续遍历这个文件夹 //我们发现getAllFile()就是传递文件夹,遍历文件夹的方法 //所以直接调用getAllFile()即可,递归 getAllFile(f); } } } }

 

最新回复(0)