递归
递归的分类:直接递归和间接递归
直接递归称为方法自身调用自己。
间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
注意事项:
1、递归一定要有条件限定,保证递归能够停下来,否则会发生栈内存溢出
2、在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
3、构造方法禁止递归(会编译报错)
递归使用的前提: 当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归
练习:递归打印阶乘
package com.itheima.demo01.Recursion;
import java.util.Scanner;
/*利用递归求阶乘
* 结束条件:==1
* 递归目的:获取下一个被乘数
* 返回值n*(n-1)*/
public class Demo02Recursion {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字:");
int n = sc.nextInt();
int result =jieCheng(n);
System.out.println(result);
}
定义一个求阶乘的方法
public static int jieCheng(int n) {
if (n == 1) {
return 1;
}
return n*jieCheng(n-1);
}
}
练习:递归打印多级目录:
package com.itheima.demo01.Recursion;
import java.io.File;
public class Demo03Recursion {
public static void main(String[] args) {
File file = new File("C:\\Users\\大 大\\Desktop\\aaa");
getAllFile(file);
}
//定义一个方法,参数传递File类型的目录,方法中对目录进行遍历
public static void getAllFile(File dir) {
//打印便利的目录名称
System.out.println(dir);
File[] files = dir.listFiles();
for (File f : files) {
//对遍历得到的File对象f进行判断,判断是否是文件夹
if(f.isDirectory()){
getAllFile(f);
}else {
//f是一个文件,直接打印即可
System.out.println(f);
}
}
}
}
综合案例:文件搜索(文件过滤)
找到以.java结尾的文件并输出
package com.itheima.demo01.Recursion;
import java.io.File;
/*
* 打印多级目录下的后缀名以.java结尾得文件*/
public class Demo04Recursion {
public static void main(String[] args) {
File file = new File("C:\\Users\\大 大\\Desktop\\aaa");
getAllFile(file);
}
//定义一个方法,参数传递File类型的目录,方法中对目录进行遍历
public static void getAllFile(File dir) {
//打印便利的目录名称
//System.out.println(dir);
File[] files = dir.listFiles();
for (File f : files) {
//对遍历得到的File对象f进行判断,判断是否是文件夹
if(f.isDirectory()){
getAllFile(f);
}else {
//f是一个文件,直接打印即可
//需要将File对象f转为字符串对象
//1.
//String name = f.getName();
//2.
//String path = f.getPath();
//3.
String s = f.toString(); //toString()方法里面调用的其实就是getPath
//将字符串变成小写的
s = s.toLowerCase();
//判断字符串是不是以.java结尾,注意返回的是布尔型
boolean b = s.endsWith(".java");
if (b){
System.out.println(f);
}
//链式编程
if (f.getName().toString().toLowerCase().endsWith(".java")){
System.out.println(f);
}
}
}
}
}