如何在不使用索引的情况下通过递归查找数组的最大值
如何用递归(不使用索引、缩短数组长度)查找数组最大值
嘿,我来帮你搞定这个递归找数组最大值的问题!先看看你当前代码里的几个核心问题:
- 错误的提前返回:你的for循环里,只要发现
arr[i] < arr[i+1]就直接返回arr[i+1],这只会返回第一个比前一个元素大的值,完全不是整个数组的最大值。 - 无限递归风险:最后一行递归调用
valorMaxim(arr)时没有缩短数组长度,会导致方法一直调用自己,最终触发栈溢出错误。 - 未处理首元素为最大值的情况:如果数组第一个元素就是最大的,你的逻辑根本不会触发任何返回,直接陷入死递归。
正确的递归思路(不使用索引、缩短数组长度)
递归的核心是分解问题:把原数组的最大值问题,拆解成「第一个元素」和「剩余元素组成的子数组的最大值」之间的比较。具体步骤:
- 基准情况:当数组长度为1时,唯一的元素就是最大值,直接返回。
- 递归情况:创建一个去掉第一个元素的子数组,递归找到子数组的最大值,再和原数组的第一个元素比较,返回较大的那个。
实现代码
import java.util.Arrays; public class MaxFinder { public static int valorMaxim(int arr[]) { // 基准情况:数组只有一个元素,直接返回 if (arr.length == 1) { return arr[0]; } // 创建去掉第一个元素的子数组 int[] subArray = Arrays.copyOfRange(arr, 1, arr.length); // 递归获取子数组的最大值 int subMax = valorMaxim(subArray); // 比较原数组第一个元素和子数组最大值,返回较大的那个 return Math.max(arr[0], subMax); } public static void main(String[] args) { int[] testArray = {1, 5, 252, 24, 7, 82, 3}; System.out.println(valorMaxim(testArray)); // 输出252,符合预期 } }
代码逻辑验证(针对你的测试数组)
我们走一遍{1,5,252,24,7,82,3}的递归流程:
- 原数组长度7 → 子数组是
{5,252,24,7,82,3},递归找它的最大值 - 子数组长度6 → 子数组是
{252,24,7,82,3},递归找最大值 - 子数组长度5 → 子数组是
{24,7,82,3},递归找最大值 - 子数组长度4 → 子数组是
{7,82,3},递归找最大值 - 子数组长度3 → 子数组是
{82,3},递归找最大值 - 子数组长度2 → 子数组是
{3},返回3 - 比较82和3 → 返回82
- 比较7和82 → 返回82
- 比较24和82 → 返回82
- 比较252和82 → 返回252
- 比较5和252 → 返回252
- 比较1和252 → 返回252(最终结果)
额外说明
如果不想依赖Arrays类,也可以手动创建子数组并复制元素,逻辑完全一致:
int[] subArray = new int[arr.length - 1]; for (int i = 0; i < subArray.length; i++) { subArray[i] = arr[i + 1]; }
内容的提问来源于stack exchange,提问作者ERFAKLK
相关产品推荐
相关产品推荐

