【问题标题】:return recursivly the biggest values minus lowest value from array递归返回数组中的最大值减去最小值
【发布时间】:2018-01-03 05:48:55
【问题描述】:

我尝试编写从数组中返回最大值 - 最小值的递归程序。

所以我写了这个:(这给我最大的价值)

public static void main(String[] args) {
    int arr[] = {1 , 5 , 11, -2};
    System.out.println(SumOfBiggestMinusLowestValue(arr, 0));   
}
private static int SumOfBiggestMinusLowestValue(int[] arr, int index) {
    if (index == arr.length-1 )  {
        return arr[index];
    }
    return Math.max (arr[index] ,SumOfBiggestMinusLowestValue(arr, index+1));
} 

我虽然这样做是为了返回 big-min:

return Math.max (arr[index] ,SumOfBiggestMinusLowestValue(arr, index+1)) -  Math.min(arr[index] ,SumOfBiggestMinusLowestValue(arr, index+1))

但它给我 7 而不是 13 是行不通的,我错过了什么? 从你的经验来看,如何递归思考?

【问题讨论】:

  • 正确答案不应该是 13 吗? (11 - (-2))
  • 哎呀,是的。对不起,我醒了很多时间没有睡觉。
  • 此代码不会为我返回 7;它返回 11(最大值)——基本上是因为除了找到 Math.max 之外,你在这里什么都做不了。也许你需要再做一次类似的事情,这次是找到最小的数字,然后减去两个结果。

标签: java arrays recursion


【解决方案1】:

基本上在递归时,您希望更改值并在满足特定条件时返回最终结果

我修改了您的代码,以便您传入数组,然后传入初始索引,并将最小值和最大值设置为数组中的第一个值。它将向下递归并检查数组中的下一个值是否大于或小于最小值和最大值并进行相应设置。一旦索引等于数组的长度,它将停止并返回最终结果:

 public static void main(String[] args) {
    int arr[] = {1 , 5 , 11, -2};
    System.out.println(pow(arr, 0, arr[0], arr[0])); 
  }

  public static int pow(int[] arr, int index, int min, int max) {
    if (index == arr.length) {
      return max - min;
    }
    int val = arr[index];
    int newMin = val < min ? val : min;
    int newMax = val > max ? val : max;
    return pow(arr, index + 1, newMin, newMax);
  }

根据 Taras Sheremeta 的建议,另一种方法如下:

public static void main(String[] args) {
    int arr[] = {1 , 5 , 11, -2};
    System.out.println(largest(arr, 0) - smallest(arr, 0)); 
  }

  public static int smallest(int[] arr, int index) {
    if (index == arr.length - 1) {
      return arr[index];
    }
    return Math.min(arr[index], smallest(arr, index + 1));
  }

  public static int largest(int[] arr, int index) {
    if (index == arr.length - 1) {
      return arr[index];
    }
    return Math.max(arr[index], largest(arr, index + 1));
  }

函数将递归地找到它们各自的最大值和最小值。

【讨论】:

  • 嗨,issaac,首先感谢您抽出时间帮助我。你能解释一下这条线吗? val
  • 当然。它是一个内联 if 语句,称为三元运算符。它的作用是在? 之前评估条件,如果条件评估为真,它将应用?: 之间的条件。如果条件评估为假,它将在: 之后应用条件。这是一种为简单的事情做 if else 的快速方法。例如,对于代码val &lt; min ? val : min,它将测试 val 是否小于 min。如果是,它将使用 val 否则它将使用 min 作为 newMin
【解决方案2】:

看起来这是递归中的一些逻辑错误。在pow 方法中,函数 Math.max(...) 和 Math.min(...) 从数组中获取一个值作为第一个参数,而不是从数组中获取一个值作为第二个参数。 pow 函数的结果不是数组中的值。

【讨论】:

  • 那么你建议怎么做? ,你能给我一个方向吗?我只知道如何得到数组的最大值/最小值,但不知道最大值减去最小值。
  • 我建议创建两个单独的函数来获取数组中的最小值和最大值。然后计算max-min。迭代次数不变,代码可读性更强。
【解决方案3】:
public static void main(String[] args) {
    int arr[] = {1 , 5 , 11, -2};
    System.out.println(pow(arr, 0, arr[0], arr[0]));
}
private static int pow(int[] arr, int index, int max, int min) {
    if (index == arr.length)  {
        return max - min;
    }

    max = Math.max(max, arr[index]);
    min = Math.min(min, arr[index]);
    return pow(arr, index + 1, max, min);
}

你可以阅读更多关于How should you approach recursion?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2021-08-07
    • 1970-01-01
    • 2021-06-03
    • 2012-01-02
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多