【问题标题】:Finding a max int value in an array recursive method在数组递归方法中查找最大 int 值
【发布时间】:2014-11-07 01:28:37
【问题描述】:

我需要帮助来创建一个在向量中找到最大值的递归方法。该方法应具有以下签名:

public int max(int[] v)

并使用私人帮助方法。

这是我尝试使用的方法:

private int biggest(int a, int b){
    if(a > b){
        return a;
    }
    else{
        return b;
    }
}

public int maxRecursive(int[] v){
    if(v.length > 1){
        return biggest(v[0], maxRecursive(Arrays.copyOfRange(v, 1, v.length - 1)));
    }
    else{
        return v[0];
    }
}

然而,这一切似乎只是返回一个数组的中间值。 例如:如果数组是`{1,2,3,5,6,7,8} 该方法返回 5。

【问题讨论】:

  • 您说它必须在向量中找到,但您的代码显示您搜索原始数组。它是哪一个?另外,为什么要递归执行此操作,这没有任何意义。直接做直线跑。
  • 我正在上编程课,这是其中一项任务。设法创建了一个迭代,但我坚持使用递归方法。
  • 你应该如何处理零大小的数组?
  • @PontusBrink 仍然没有解释您正在使用哪种数据结构。它是一个向量,还是一个普通的旧 int 数组? (请编辑问题,不要提及您未使用的问题)

标签: java arrays recursion


【解决方案1】:

您有一个错误,因为您使用了copyOfRange 错误。应该是:

maxRecursive(Arrays.copyOfRange(v, 1, v.length));

这是因为to 参数是专有。因此,当您的 tov.length - 1 时,数组最终只会查看从 1 到元素 before 最后一个元素的所有内容。

如有疑问,请阅读Javadocs

【讨论】:

    【解决方案2】:

    最好有一个方法可以在数组中找到最大到某个索引的值:

    public static int findMax(int[] arr, int lastPos) {
        if (lastPos==0)
            return arr[lastPos];
        else
            return biggest(arr[lastPos], findMax(arr, lastPos-1));
    }
    

    然后最大的是

    findMax(arr, arr.length-1);
    

    这避免了所有的数组复制,这是相当昂贵的。您的代码会进行大量复制,这将使其对于大型数组效率低下。在这个版本中,您传递相同的数组,但作为参考;然后你告诉方法在考虑数组时它允许走多远。

    关键观察是数组的最大元素要么是最后一个元素,要么是数组中不包括最后一个元素的最大值。这与您的想法基本相同,从头开始;它只是使终止案例更容易编写和理解。

    【讨论】:

      【解决方案3】:

      直接来自您正在使用的方法的 Javadoc (Arrays.copyOfRange):

      original - 要从中复制范围的数组

      from - 要复制的范围的初始索引,包括

      to - 要复制的范围的最终索引,独占。 (此索引可能位于数组之外。)

      强调我的。

      【讨论】:

        【解决方案4】:

        你必须改变方法 maxRecursive

        public int maxRecursive(int[] v){
            if(v.length > 1){
                return biggest(v[0], maxRecursive(Arrays.copyOfRange(v, 1, v.length)));
            }
            else{
                return v[0];
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-18
          • 2013-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-10
          相关资源
          最近更新 更多