【问题标题】:Recursive Method to Find Smallest Int? [duplicate]找到最小整数的递归方法? [复制]
【发布时间】:2015-07-03 12:11:29
【问题描述】:

所以我有一个任务,我必须创建一个方法,该方法接受一个 int[] 参数并返回最小的 int。不过只有一个问题……我们必须使用递归!无论如何,这是我的代码:

static int[] arr = {12, 8, 4, 17};

public static void main(String[] args){
System.out.println("Minimum is :" + findMin(arr));
}

public static int findMin(int[] iArray){
    if(arr.length == 0) {
        System.err.println("Please Pass An Array With At Least 1 Element.");
        return (Integer) null;
    }
    else return findMinFromArray(iArray, 0, iArray[0]); //call method with starting parameters ie index = 0 & min = iArray[0]
}

private static int findMinFromArray(int[] iArray, int index, int min) {
    if(index <= (iArray.length - 1)){
        if(iArray[index] < min){
            min = iArray[index];
        }
        System.out.println("Before: " + "Index = " + index + " | Min = " + min);
        findMinFromArray(iArray, index + 1, min);
    }
    System.out.println("After: " + "Index = " + index + " | Min = " + min);
    return min;
}

这是输出...

Before: Index = 0 | Min = 12
Before: Index = 1 | Min = 8
Before: Index = 2 | Min = 4
Before: Index = 3 | Min = 4
After: Index = 4 | Min = 4
After: Index = 3 | Min = 4
After: Index = 2 | Min = 4
After: Index = 1 | Min = 8
After: Index = 0 | Min = 12
Minimum is :12

如您所见,代码有点工作,但我不知道如何让程序停止,而不是像现在这样再次返回。

【问题讨论】:

    标签: java arrays recursion methods minimum


    【解决方案1】:

    只是为了好玩另一个可能的解决方案:

    int minValue(int[] arr, int index) {
      if (index == arr.length - 1) return arr[index];
      else return Math.min(arr[index], minValue(arr, index + 1));
    }
    
    int[] arr = {12, 8, 4, 17};
    System.out.println("Minimum is :" + minValue(arr, 0));
    

    此解决方案中未检查空数组

    【讨论】:

      【解决方案2】:

      Java 是 pass by value。这意味着如果您更改方法内的参数值,则此更改不会反映到调用方法时使用的变量。这适用于您的 int min 参数。

      除此之外,您永远不会在内部使用findMinFromArray 的结果来检查最小值是多少:iArray[index] 的当前值或此方法的结果。

      我会重新设计方法 findMinFromArray 以省略变量 int min 并返回当前索引的最小值和该方法的结果:

      private static int findMinFromArray(int[] iArray, int index) {
          if(index <= (iArray.length - 1)) {
              int current = iArray[index];
              int otherMin = findMinFromArray(iArray, index + 1);
              return (current < otherMin) ? current : otherMin;
          }
          return Integer.MAX_VALUE;
      }
      

      与当前问题无关,但这里还有另一个问题:

      return (Integer) null;
      

      当您发送一个空数组作为参数时,这将抛出一个NullPointerException。而是返回一个类似Integer.MAX_VALUE 的值。

      【讨论】:

        【解决方案3】:

        你的错误是忽略了递归调用的结果。

        改变

        findMinFromArray(iArray, index + 1, min);
        

        return findMinFromArray(iArray, index + 1, min);
        

        完整的固定方法:

        private static int findMinFromArray(int[] iArray, int index, int min) {
            if(index <= (iArray.length - 1)){
                if(iArray[index] < min){
                    min = iArray[index];
                }
                System.out.println("Before: " + "Index = " + index + " | Min = " + min);
                return findMinFromArray(iArray, index + 1, min);
            }
            System.out.println("After: " + "Index = " + index + " | Min = " + min);
            return min;
        }
        

        输出:

        Before: Index = 0 | Min = 12
        Before: Index = 1 | Min = 8
        Before: Index = 2 | Min = 4
        Before: Index = 3 | Min = 4
        After: Index = 4 | Min = 4
        

        【讨论】:

        • 是的,非常感谢!看来我需要再看一遍演讲幻灯片了哈哈
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2015-09-03
        • 2020-07-03
        • 2011-08-01
        • 1970-01-01
        相关资源
        最近更新 更多