1.什么是递归
所谓的递归是指,在方法中调用方法自己
public class RecursionDemo {
public static void main(String[] args) {
//调用方法
show();
}
public static void show(){
System.out.println("show....");
show();
}
}
注意:
无限递归肯定会出错! StackOverflowError(栈溢出错误!!)
因为:方法不断入栈执行,终有一天栈内存会满了,称为栈溢出
我们需要一个有限次数的递归,这才是有意义的(递归应该有一个出口/结束点)
public class RecursionDemo {
public static void main(String[] args) {
//调用方法
show(10);
}
public static void show(int n){
//让递归有一个出口,结束点,不再调用自己了!!
if (n == 0) {
return;
}
System.out.println("show....");
show(n-1);
}
}
注意:正确的使用递归,应该满足两个条件
a.必须让递归有出口/结束点
b.递归的次数也不能太多,必须保证到达结束点前不会栈内部溢出
2.递归求和案例
我们此处仅仅是为了练习递归,开发中建议使用循环
需求:
求1+2+3…+n的和
使用循环:
/**
* 使用循环
*/
public static int getSum(int n){
int sum = 0;
for (int i = 1; i < n+1; i++) {
sum+=i;
}
return sum;
}
使用递归:
a.先定义方法
b.找规律,调用自己
c.找出口,让递归有结束点
/**
* 使用递归:
* a.先定义方法
* b.找规律,调用自己
* c.找出口,让递归有结束点
*/
public static int getSum(int n){
//出口
if (n == 1){
return 1;
}
//找规律
//1+2+3...n = (1+2+3...n-1)+n
//getSum(n) = getSum(n-1)+n
return getSum(n-1)+n;
}
3.递归求阶乘案例
需求:
求123…n的积(n!,n的阶乘)
public class RecursionDemo03 {
public static void main(String[] args) {
//需求:求1*2*3..n的积(n!,n的阶乘)
System.out.println(getJi(6));
}
/**
* 使用递归:
* a.先定义方法
* b.找规律,调用自己
* c.找出口,让递归有结束点
*/
public static int getJi(int n){
//出口
if (n == 1){
return 1;
}
//找规律
//1*2*3...n = (1*2*3.*n-1)*n
//getJi(n) = getJi(n-1)*n
return getJi(n-1)*n;
}
4.文件搜索案例
需求:
在一个指定的目录中查找指定后缀的文件
指定的目录: C:\Users\Administrator\Desktop\temp\aaa
指定的文件: xx.txt文件
public class RecursionDemo04 {
public static void main(String[] args) {
//需求:
//在一个指定的目录中查找指定后缀的文件
//指定的目录: C:\Users\Administrator\Desktop\temp\aaa
//指定的文件: xx.txt文件
File fileDir = new File("C:\\Users\\Administrator\\Desktop\\temp\\aaa");
printTxtFile(fileDir);
}
//打印指定目录下的所有.txt文件
public static void printTxtFile(File ff){
//1.调用遍历目录的方法
File[] files = ff.listFiles();
//2.循环
for (File file : files) {
//3.判断
if (file.isFile() && file.getName().endsWith(".txt")) {
System.out.println(file);
} else if (file.isDirectory()){
//4.遍历这个文件夹,打印其中的.txt文件
printTxtFile(file);//递归
}
}
}
}