【问题标题】:Recursive function that finds the minimum value in an ArrayList of Integers in Java在Java中的整数数组列表中找到最小值的递归函数
【发布时间】:2021-04-17 15:55:11
【问题描述】:

这是我作为自学 java 的一部分一直在思考的问题。问题在于编写一个递归函数,在整数的 ArrayList 中找到最小值。下面你会发现我的尝试。我相信它按预期工作,但我想知道是否有更好的方法来完成这项工作。任何 cmets 都表示赞赏。

public static int findMin(ArrayList<Integer> numbers){
        // Base Case
        if(numbers.size()==1){
            return numbers.get(0).intValue();
        }
    
  
        ArrayList<Integer> numbers_short = new ArrayList<Integer>(numbers);
        numbers.remove(numbers.size()-1);

        return Math.min(numbers_short.get(numbers_short.size()-1).intValue(), findMin(numbers));
    }

【问题讨论】:

    标签: java arraylist integer minimum


    【解决方案1】:

    保留原始方法签名和形式参数 - 可以通过消除每次创建新临时数组的需要来简化代码。

    public static int findMin(ArrayList<Integer> numbers){
            if (numbers.size() == 1) return numbers.get(0);
            return Math.min(numbers.remove(0), findMinimum(numbers));
        }
    
    

    numbers.remove(0) 将同时删除第一个元素并返回被删除元素的值,无需创建临时数组。

    【讨论】:

      【解决方案2】:

      您的示例在这种情况下不应该使用递归的方式不太好。 但无论如何,您可以避免每次都复制数组,方法是使用带有 start 和 end 参数的方法只分析初始数组的一部分。

      类似的东西:

      
          public static int findMin(ArrayList<Integer> numbers) {
              return findMin(numbers, 0, numbers.size() - 1);
          }
      
          public static int findMin(ArrayList<Integer> numbers, int start, int end) {
              if (end == start)
                  return numbers.get(start);
              int middle = start + (end - start) / 2;
              return Math.min(findMin(numbers, start, middle), findMin(numbers, middle + 1, end));
          }
      

      如果需要,添加一个检查以防数组为空。

      我使用“中间”方法的原因是每次它将数组除以 2,这意味着最后它会限制堆栈溢出的风险,因为它将最大递归数除以 2递归每个元素。

      【讨论】:

        【解决方案3】:

        您可能希望避免在每次调用该方法时都创建一个新的 ArrayList 对象。对于较小的输入,这似乎无关紧要,但对于非常大的输入,它可能会导致StackOverflowError

        具有相似时间复杂度的更简洁的解决方案可以是:

        public static int findMin(ArrayList<Integer> numbers) {
                return findMin(numbers, numbers.size());
            }
        
        public static int findMin(ArrayList<Integer> numbers, int len) {
            // Base Case
            if (len == 1) {
                return numbers.get(0);
            }
            
            return Math.min(numbers.get(len-1), findMin(numbers, len-1));
        }
        

        对垃圾收集器和递归的引用:Garbage Collection in Java with Recursive Function

        【讨论】:

          猜你喜欢
          • 2017-03-27
          • 2022-01-23
          • 1970-01-01
          • 2016-06-10
          • 1970-01-01
          • 2014-01-02
          • 1970-01-01
          • 2010-12-16
          • 2020-11-28
          相关资源
          最近更新 更多