递归求数组最大值遇数组越界异常且未识别首元素问题
解决递归查找数组最大值的越界与元素遗漏问题
嘿,我来帮你排查下代码里的问题!你的递归思路是对的,但没注意Java数组的0-based索引规则,导致了两个关键问题:
问题分析
- 数组越界异常:Java数组的索引从0开始,你定义的数组
A有8个元素,有效索引范围是0~7。但你调用maximumR(A,8)时,递归过程中会尝试访问A[8],这超出了数组的有效范围,直接触发ArrayIndexOutOfBoundsException。 - 无法识别第一个元素:当递归终止条件
n==1时,你返回的是A[1](数组第二个元素),而数组的第一个元素是A[0],这就导致第一个元素90完全没被纳入最大值比较的范围。
修正后的代码
public class MaximumRec { public static void main(String[] args) { int[] A = {90, 45,12,19,72,55,15,19}; // 传入数组最后一个元素的索引(7),而不是数组长度(8) int x = maximumR(A, A.length - 1); System.out.print(x); } static int maximumR(int[] A, int n) { int max; // 终止条件改为n==0,返回数组第一个元素A[0] if (n == 0) { return A[n]; } else { max = maximumR(A, n-1); // 比较当前元素A[n]和前n个元素的最大值 if(max < A[n] ) { max = A[n]; } } return max; } }
逻辑说明
修正后的递归逻辑是这样的:
- 每次递归调用处理到索引为
n的元素,先递归查找0~n-1范围内的最大值 - 把这个最大值和当前元素
A[n]比较,取较大的那个作为0~n范围的最大值 - 当
n==0时,直接返回第一个元素A[0],作为递归的终止条件
这样既避免了数组越界,也能正确把第一个元素纳入最大值的比较范围,运行后会输出正确的最大值90。
内容的提问来源于stack exchange,提问作者qad
相关产品推荐
相关产品推荐

