记录一个java递归
一、思路
递归说白了就是自己调自己
定义一个a方法,a方法中的逻辑还要调用a方法
二、代码
public void a() { a(); }
此时递归就跑起来了
三、死循环的问题
此时递归会一直进行下去,就造成了死循环
于是要有一个停止递归的条件
public void a() { if (xx) {// 添加停止递归的条件 a(); }
四、一个简单的案例
调用第三方的接口时,接口数据一般会进行分页处理
此时如果想要一次获取全量数据,就可以使用递归
public class Test001 { public static void main(String[] args) { Test001 test001 = new Test001(); List<String> list = new ArrayList<>(); test001.a(list, 1); System.out.println("list = " + list); } public void a(List<String> list, int pageNumber) { // 查询接口获取分页数据 int count = 41; int pageSize = 20; System.out.println("第"+pageNumber+"页,"+pageSize+"条。"); list.add("20条"); if (count > pageNumber * pageSize) { // 最后一页停止递归 pageNumber++; a(list, pageNumber); } } }
五、要注意的两点事情
1、注意递归逻辑中产生很多对象,可能导致内存溢出
public class Test001 { public static void main(String[] args) { Test001 test001 = new Test001(); List<String> list = new ArrayList<>(); test001.a(list, 1); System.out.println("list = " + list); } public void a(List<String> list, int pageNumber) { // 查询接口获取分页数据 // 为请求第三方接口构建的数据 AAA aaa = new AAA(); int count = 41; int pageSize = 20; System.out.println("传入"+aaa+"条件,获取第"+pageNumber+"页,"+pageSize+"条。"); list.add("20条"); if (count > pageNumber * pageSize) { // 最后一页停止递归 pageNumber++; a(list, pageNumber); } } }
此时递归中为请求第三方接口构建了一些查询条件
创建的对象会随着程序递归的次数越来越多
我们完全可以将一些不变的条件在递归外面构建一次作为参数传递到递归方法中
避免创建对象过多导致的内存溢出问题
public class Test001 { public static void main(String[] args) { Test001 test001 = new Test001(); List<String> list = new ArrayList<>(); // 为请求第三方接口构建的数据 AAA aaa = new AAA(); test001.a(list, 1, aaa); System.out.println("list = " + list); } public void a(List<String> list, int pageNumber, AAA aaa) { // 查询接口获取分页数据 int count = 41; int pageSize = 20; System.out.println("传入"+aaa+"条件,获取第"+pageNumber+"页,"+pageSize+"条。"); list.add("20条"); if (count > pageNumber * pageSize) { // 最后一页停止递归 pageNumber++; a(list, pageNumber, aaa); } } }
2、开启递归
有的时候递归需要给一个开启递归的条件
如上分页递归的代码,main中运行a方法,参数pageNumber是随着每次递归递增的
这样就需要一个启动条件,如代码中从第1页开始查询
public static void main(String[] args) { Test001 test001 = new Test001(); List<String> list = new ArrayList<>(); // 为请求第三方接口构建的数据 AAA aaa = new AAA(); // pageNumber为1,从第一页开始查询,启动递归 test001.a(list, 1, aaa); System.out.println("list = " + list); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具