Java递归处理数组的核心是“当前元素+剩余子数组”,关键在于明确终止条件和递归逻辑;典型场景包括递归求和、扁平化嵌套数组、组合总和(回溯)、索引驱动模拟链表。

Java 中用递归处理数组,核心在于把“整块数组”拆成“当前元素 + 剩余子数组”,再逐层缩小问题规模。关键不是写得有多炫,而是想清楚两件事:什么时候停(终止条件),以及当前这一步怎么跟下一步衔接(递归逻辑)。下面几种典型场景,都是真实开发中容易遇到的。
递归求和:从尾部开始累加
给定 int[] arr = {3, 6, 8, 2, 1},不使用循环,只靠递归算总和。
思路是:数组长度为 n 时,和 = 前 n−1 个元素的和 + 最后一个元素 arr[n−1];当 n == 0 时,和为 0。
- 终止条件:传入的长度参数为 0
- 递归调用:GetSum(arr, n − 1) + arr[n − 1]
- 注意:每次递归都减少一个元素,天然避免越界,也不需额外索引变量
扁平化嵌套 Object 数组
面对类似 Object[] arr = {1, 2, new Object[]{3, 4, new Object[]{5}}, 6} 这种深度不确定的结构,要提取全部 Integer 元素。
立即学习“Java免费学习笔记(深入)”;
迭代只能扫一层,而递归能“钻进去”:
- 遍历每个元素 obj
- 若 obj 是 Integer → 加入结果列表
- 若 obj 是 Object[] → 递归调用同一方法处理该子数组
- 其他类型可忽略或按需处理(比如抛异常、转字符串等)
这种“遇数组就递归”的模式,天然适配任意嵌套层级,代码简洁且意图清晰。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
组合类问题:如组合总和(回溯式递归)
给定数组 candidates = [2,3,6,7],目标 target = 7,找出所有和为 target 的数字组合(元素可重复使用)。
这不是简单遍历,而是搜索空间树:
- 每层决定是否选 candidates[index]:选了就 target 减去它,index 不变(允许重复);不选就 index + 1
- 终止条件有两个:target == 0(找到解),或 index 超出数组长度(路径结束)
- 用 List<Integer> combine 记录当前路径,List<List<Integer>> ans 收集所有可行解
这类问题递归体里常带状态参数(target、index、combine),体现的是“决策树展开 + 回退”的过程。
链表式思维迁移到数组:索引驱动递归
单链表天然递归(head → head.next),数组虽是连续内存,但可用索引模拟这种结构。
例如求数组最大值:
- 定义方法 max(int[] a, int i),表示从索引 i 开始到末尾的最大值
- 终止条件:i >= a.length → 返回 Integer.MIN_VALUE
- 递归逻辑:Math.max(a[i], max(a, i + 1))
这种方式把数组当成“伪链表”,每步只关心当前位置和后续,逻辑干净,易于扩展(比如加过滤、变换等)。

















