Java递归及案例分析

一,什么是递归?

递归:方法内自己调用自己

伪代码

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);
        }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ang_qq_252390816

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值