递归中越界检查与基准条件的顺序是否重要?该如何选择?
递归条件顺序的选择原则
递归代码里的条件顺序核心是先确保状态合法,再处理业务逻辑,具体可以按以下思路判断:
1. 优先做非法状态过滤(比如越界检查)
这是最稳妥的通用规则——所有后续的条件判断和数组/对象访问,都依赖当前状态是合法的。
拿你给出的例子分析:
第一种写法是正确的:
if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length) { return Integer.MAX_VALUE; } if (i == matrix.length - 1) { return matrix[i][j]; }先把所有越界的非法情况过滤掉,剩下的
i和j必然在数组合法索引范围内,这时候访问matrix[i][j]是绝对安全的。第二种写法存在严重bug:
if (i == matrix.length - 1) { return matrix[i][j]; } if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length) { return Integer.MAX_VALUE; }如果出现
i = matrix.length - 1但j >= matrix[0].length的情况,代码会直接执行return matrix[i][j],触发数组越界异常——因为这时候还没做j的合法性检查。
2. 例外:基准条件本身隐含合法性
如果你的递归终止基准条件,本身已经能保证当前状态是合法的,那可以前置这个条件,但这种场景非常有限。
比如某个问题的基准条件是i == 0 && j == 0,这时候i和j必然在数组的合法范围内(因为数组索引从0开始),这时候先判断这个基准条件没问题:
if (i == 0 && j == 0) { return matrix[i][j]; } // 再做其他越界检查和递归逻辑
但即使这种情况,优先做非法状态过滤也不会出错,反而能让代码逻辑更统一,降低出错概率。
通用流程总结
写递归代码时,建议按以下顺序处理条件:
- 第一步:过滤所有非法/无效状态(越界、不符合问题规则的输入等),返回对应的边界值
- 第二步:处理合法状态下的基准终止条件
- 第三步:编写递归分解逻辑,调用子问题
内容的提问来源于stack exchange,提问作者Silent Geek
相关产品推荐
相关产品推荐

