
本文详解如何用纯递归方法计算二维矩阵每列中从顶部开始、连续非零元素的和——遇到第一个0即停止,同时避免数组越界,修正常见递归累加逻辑错误。
本文详解如何用纯递归方法计算二维矩阵每列中从顶部开始、连续非零元素的和——遇到第一个0即停止,同时避免数组越界,修正常见递归累加逻辑错误。
在递归处理矩阵列求和问题时,核心目标是:对每一列,从第0行开始向下遍历,累加所有连续的正整数(题目隐含非负整数,且遇 0 即终止),一旦遇到 0 或越界,立即停止该列递归。原代码中 searchDown 方法存在两个关键缺陷:
- 递归结果未参与累加:return matrix[i][j]; 忽略了下层递归返回的和;
- 缺乏边界检查:未判断 i 是否超出行数,可能导致 ArrayIndexOutOfBoundsException。
✅ 正确的递归设计应遵循“自顶向下探索 + 自底向上聚合”原则:当前层值加上后续合法递归调用的结果。
以下是修复后的完整实现:
static int solution(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
int sum = 0;
for (int j = 0; j = matrix.length || matrix[i][j] == 0) {
return 0;
}
// 递归:当前值 + 下一行同列的递归和
return matrix[i][j] + searchDown(matrix, i + 1, j);
}
? 关键说明:
- searchDown 的递归基(base case)包含双重防护:i >= matrix.length(防止下标越界)和 matrix[i][j] == 0(按题意停止累加);
- 递归体采用 尾部聚合模式:matrix[i][j] + searchDown(...) 确保每一层的值都被纳入总和;
- 主函数 solution 仍用循环遍历列,这是合理的设计——递归负责“单列纵向扫描”,迭代负责“多列横向调度”,符合单一职责原则。
? 以示例矩阵验证:
int[][] matrix = {
{0, 1, 1, 2},
{0, 5, 0, 0},
{2, 0, 3, 3}
};
- 第0列:matrix[0][0] == 0 → 贡献 0;
- 第1列:1 + 5 = 6(matrix[2][1] == 0,停止);
- 第2列:1(matrix[1][2] == 0,停止);
- 第3列:2(matrix[1][3] == 0,停止);
✅ 总和 = 0 + 6 + 1 + 2 = 9。
⚠️ 注意事项:
- 若矩阵含负数,需明确题意是否允许(本题以 0 为终止条件,故建议用 == 0 而非
- 递归深度 = 最长非零列长度,对于超大矩阵需警惕栈溢出,生产环境可考虑转为迭代(如用栈模拟);
- 始终优先校验输入合法性(空矩阵、null 引用等),提升鲁棒性。
掌握此类“列驱动+深度优先递归”的模式,有助于解决矩阵路径、岛屿计数、树形DP等更复杂问题。










