Java实用方法整理(十八)——递归

本文深入解析递归算法的原理与应用,强调递归的边界条件与调用机制,通过实例展示如何避免死递归及内存溢出。并通过三个实战案例,包括斐波那契数列、文件搜索与目录删除,详细介绍递归在实际问题解决中的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,递归方法注意事项

(1)递归一定要有出口,否则就是死递归

(2)递归的次数不能太多,否则就内存溢出

(3)构造方法不能递归使用

2,递归方法创建技巧

(1)递归是一个方法

(2)方法中要有出口(例如:return,输出命令等)

(3)寻找规律,以代码实现规律

3,案例+源码

(1)有一对兔子,从出生后第3个月起每个月都生1对兔子,小兔子长到第3个月后每个月又生1对兔子,假如兔子都不死,那么第N个月时兔子的对数是多少?

分析前6个月兔子对数规律如下:从第三个月开始,每个月兔子数等于前两个月兔子数之和。

月数123456
兔子数112358
package test;
/**
* @author Manduner_TJU
* @version 创建时间:2018年10月26日下午7:32:43
*/
//不死神兔问题
public class Test2 {
	public static void main(String[] args) {
		int n = 20;
		System.out.println(digui(n));
	}
	
	public static int digui(int n) {
		if(n == 1 || n == 2) {
			return 1;
		}else {
			return digui(n-2) + digui(n-1);
		}
	}
}

 

(2)输出我的电脑G盘目录下所有以“.mkv”结尾的文件的绝对路径

package test;

import java.io.File;

/**
* @author Manduner_TJU
* @version 创建时间:2018年10月26日下午9:42:39
*/
public class Test4 {
	public static void main(String[] args) {
		File file = new File("G:\\");
		getAviPath(file);
	}

	private static void getAviPath(File file) {
		File[] ff = file.listFiles();
		//由于我的电脑G盘目录下有系统自带的隐藏文件夹,会导致ff为null,所以做出了以下判断
		//本人建议不管是遍历磁盘根目录还是某个文件夹,都要加上下面的判断,否则会报空指针错误
		if (ff == null) {
			return;
		}
		//增强for的循环目标不能是null,否则会报空指针错误
		for(File f : ff) {
			if(f.isFile()) {
				if(f.getName().endsWith(".mkv")) {
					System.out.println(f.getAbsolutePath());
				}
			}else {
				getAviPath(f);
			}
		}
		
	}
}

 

(3)删除我的电脑G盘目录下Test文件夹(注意,此功能慎用,万一删错文件夹了,可就恢复不了了)

package test;

import java.io.File;

/**
* @author Manduner_TJU
* @version 创建时间:2018年10月26日下午10:31:41
*/
public class Test5 {
	public static void main(String[] args) {
		File file = new File("G:\\Test");
		deleteTestFile(file);
	}

	private static void deleteTestFile(File file) {
		File[] ff = file.listFiles();
		if(ff==null) {
			return;
		}else {
			for(File f : ff) {
				if(f.isDirectory()) {
					deleteTestFile(f);
				}else {
					System.out.println(f.getName()+"----"+f.delete());
				}
			}
		}
		
		System.out.println(file.getName()+"----"+file.delete());
		
	}
}

 

### 南昌大学软件学院算法期末考试资料 对于南昌大学软件学院的学生而言,准备算法期末考试可以通过多种途径获取复习材料和试题。通常情况下,学校会提供官方的教学大纲以及推荐的学习资源[^1]。 #### 官方渠道 - **教学平台**:通过学校的在线学习平台(如超星学习通),学生可以获得教师上传的课件、讲义和其他辅助学习材料。 - **图书馆资源**:校内电子图书库可能收录有历年真题解析及相关教材,这些都对备考非常有用。 #### 社区交流 除了正式渠道外,同学之间的资源共享也是重要的方式之一。加入班级群聊或专业的学术论坛可以帮助找到更多非官方但实用的信息: - **社交网络**:利用QQ群、微信群等即时通讯工具联系往届生询问经验分享; - **技术社区**:像GitHub这样的平台上或许能找到由其他学生整理并公开发布的笔记文档。 #### 实际操作练习 针对具体的编程技能考核部分,实践尤为重要。例如,在Java程序设计方面,可以按照一定比例划分数据集来进行模型训练与验证,从而更好地理解如何处理大规模的数据集[^2]。 ```python from sklearn.model_selection import train_test_split data_size = 100_000 train_data, test_data = train_test_split(range(data_size), test_size=0.4) print(f"Training set size: {len(train_data)}") print(f"Testing set size : {len(test_data )}") ``` 此外,关于动态规划的经典题目——最长公共子序列问题也经常出现在此考试中。掌握这问题不仅有助于提高解题能力,还能加深对递归结构的理解[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值