递归实现数组最大元素索引方法遇StackOverflowError问题求助
问题分析与修复
你的代码触发StackOverflowError的核心原因是区间分割逻辑错误:直接用last / 2作为左半区间的末尾索引,当处理非从0开始的子区间时(比如处理索引3到5的子数组),last / 2的结果会小于当前的first值,导致递归调用时出现first > last的非法区间,进而触发无限递归,最终耗尽栈空间。
举个例子:处理区间[3,5]时,last/2 = 5/2 = 2,左半区间变成[3,2],此时first > last,但你的代码没有处理这种非法情况,会继续递归分割该区间,陷入死循环。
修复后的代码
将区间分割逻辑改为first + (last - first) / 2,以此正确计算当前区间的中间位置,避免出现非法区间:
private static int findLargest(int[] items, int first, int last) { if (first == last) { return first; } if (last - 1 == first) { return items[first] > items[last] ? first : last; } int mid = first + (last - first) / 2; // 正确计算当前区间的中间索引 int firstHalf = findLargest(items, first, mid); int secondHalf = findLargest(items, mid + 1, last); return items[firstHalf] > items[secondHalf] ? firstHalf : secondHalf; }
额外说明
- 用三元运算符简化了条件判断的写法,代码更简洁且逻辑不变
- 新增的
mid变量让区间分割逻辑更清晰,便于后续维护
内容的提问来源于stack exchange,提问作者user3491432
相关产品推荐
相关产品推荐

