递归概述
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);
}
}
}
}