You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用索引的情况下通过递归查找数组的最大值

如何用递归(不使用索引、缩短数组长度)查找数组最大值

嘿,我来帮你搞定这个递归找数组最大值的问题!先看看你当前代码里的几个核心问题:

  1. 错误的提前返回:你的for循环里,只要发现arr[i] < arr[i+1]就直接返回arr[i+1],这只会返回第一个比前一个元素大的值,完全不是整个数组的最大值。
  2. 无限递归风险:最后一行递归调用valorMaxim(arr)时没有缩短数组长度,会导致方法一直调用自己,最终触发栈溢出错误。
  3. 未处理首元素为最大值的情况:如果数组第一个元素就是最大的,你的逻辑根本不会触发任何返回,直接陷入死递归。

正确的递归思路(不使用索引、缩短数组长度)

递归的核心是分解问题:把原数组的最大值问题,拆解成「第一个元素」和「剩余元素组成的子数组的最大值」之间的比较。具体步骤:

  • 基准情况:当数组长度为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}的递归流程:

  1. 原数组长度7 → 子数组是{5,252,24,7,82,3},递归找它的最大值
  2. 子数组长度6 → 子数组是{252,24,7,82,3},递归找最大值
  3. 子数组长度5 → 子数组是{24,7,82,3},递归找最大值
  4. 子数组长度4 → 子数组是{7,82,3},递归找最大值
  5. 子数组长度3 → 子数组是{82,3},递归找最大值
  6. 子数组长度2 → 子数组是{3},返回3
  7. 比较82和3 → 返回82
  8. 比较7和82 → 返回82
  9. 比较24和82 → 返回82
  10. 比较252和82 → 返回252
  11. 比较5和252 → 返回252
  12. 比较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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:32:34