一,什么是递归?
递归:方法内自己调用自己
伪代码
private void method(){
method();
}
二,构成递归的条件
- 1,递归结束条件
//伪代码
private int fun(int num){
if(num==1||num ==2){ //递归结束条件
return 1;
}
}
- 2,递归方法的规律
//用递归实现斐波那契数列,或者说一对兔子的繁衍
private static int fun(int num){
if(num==1||num ==2){
return 1;
}
return fun(num-1)+ fun(num-2); //递归规律:fun(m) = fun(m-1)+fun(m-2)
}
三,递归的优缺点
优点:可以不知道循环多少次;不想for循环必须知道循环次数;
缺点:递归调用次数过多,可能会导致栈内存溢出;
四,递归案例
- 1,从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.png文件名
private static void printPNG(File dir){
File[] subFile = dir.listFiles();
for (File file : subFile) { //递归结束条件
if(file.isFile()&&file.getName().endsWith(".png")){ //是文件且是.png结尾的文件;
System.out.println(file);
} else if(file.isDirectory()){//是文件夹
printPNG(file); //如果是文件夹递归调用继续查找此文件夹下的.png文件并打印;
}
}
}
private static File getFile(){
System.out.println("请输入一个文件夹路径:");
Scanner sn = new Scanner(System.in);
while(true){
String path = sn.nextLine();
File file = new File(path);
if(!file.exists()){
System.out.println("输入文件夹路径不存在,请输入正确的文件夹路径");
}else if(file.isFile()){
System.out.println("输入的是文件路径,需重新输入");
}else{
return file;
}
}
}
- 2,从键盘接收一个文件夹路径,统计该文件夹大小
private static void test1() {
// 从键盘接收一个文件夹路径,统计该文件夹大小
long length = getFileLength(getFile());
System.out.println(length);
}
private static long getFileLength(File file){
long sum = 0;
File[] files = file.listFiles();
for (File subFile : files) { //递归结束条件
if(subFile.isFile()){
sum = sum + subFile.length();
}else{
sum = sum + getFileLength(subFile); //如果是文件夹递归调用,获取此文件夹下的大小,
}
}
return sum;
}
private static File getFile() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件夹路径:");
File file = new File(sc.nextLine());
while (true){
if (!file.exists()) {
System.out.println("输入的路径不存在,请从新输入:");
} else if (file.isFile()) {
System.out.println("输入的是文件路径,请重新输入:");
} else {
return file;
}
}
}
- 3,从键盘接收一个文件夹路径,删除该文件夹
private static void test2() {
//从键盘接收一个文件夹路径,删除该文件夹
deleteDir(getFile());
}
private static void deleteDir(File file){
File[] files = file.listFiles();
for (File subFile : files) { //递归结束条件
if (subFile.isFile()) {
subFile.delete();
}else{
deleteDir(subFile);//如果是文件夹,递归调用删除此文件夹下的文件和此文件夹
}
}
file.delete();
}
private static File getFile() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件夹路径:");
File file = new File(sc.nextLine());
while (true){
if (!file.exists()) {
System.out.println("输入的路径不存在,请从新输入:");
} else if (file.isFile()) {
System.out.println("输入的是文件路径,请重新输入:");
} else {
return file;
}
}
}
- 4,斐波那契数列 1 1 2 3 5 8 13 21 34 55 89 144
private static int fun(int num) {
if (num == 1 || num == 2) { //递归结束条件
return 1;
} else {
return fun(num - 1) + fun(num - 2);
}
}