【问题标题】:Recursive function to difference between two values in array递归函数来区分数组中的两个值
【发布时间】:2017-05-25 04:53:33
【问题描述】:

我正在使用 Java。

我需要实现一个递归函数来计算每两个值之间的差异并为我返回大小为 2 [MAXIMUM_DIFF, STARTINDEX] 的数组。

对于以下数组:

arr = {1, 4, 60, -10, 2, 7, 56, -10}

递归方法返回大小为 2 的数组:[70,2],因为最大差异为 70 (60-(-10)=70),而 60 的索引为 2。

我有 90% 来自解决方案:

public static int[] getMax(int[] arr) {

    int [] retArr = new int[2];

    if(arr.length == 1)
        return retArr;
    else {
        return getMax(arr, retArr);
    }

}

public static int[] getMax(int[] arr, int[] retArr) {
    if(retArr[1] == arr.length - 1)
        return retArr;

    int currentMaxVal = arr[retArr[1]] - arr[retArr[1] + 1];

    if(currentMaxVal > retArr[0]) {
        retArr[0] = currentMaxVal;
    }

    retArr[1] = retArr[1] + 1;

    return getMax(arr, retArr);

}

但是结果是[70,7] 而不是[70,2] 因为这条线retArr[1] = retArr[1] + 1;

这是因为我不知道在哪里保存索引,那么我该如何保存索引呢?

*我不确定getMax(int [] arr, int []retArr) 的第二个参数 它可能会有所不同

我无法添加其他参数,可能要更改getMax(int [] arr, int []retArr)的第二个参数,并且我不能使用静态变量

【问题讨论】:

  • 为什么不传递另一个名为 index 的参数并仅在它进入比较 if 语句时才更新它

标签: java arrays algorithm recursion


【解决方案1】:
if(currentMaxVal > retArr[0])
{
  retArr[0] = currentMaxVal;
}

retArr[1] = retArr[1] + 1;

应该是

if(currentMaxVal > retArr[0])
{
  retArr[0] = currentMaxVal;
  retArr[1] = currentIndex;
}

currentIndex 应该是传递给函数的附加参数。 (以及对当前索引的其他引用相应更新)

更新:

我认为这里的重点是理解“分而治之”,即您将问题分解为一个较小的问题,然后进行排序以获得最好的问题。像这样(如果比正常情况更尴尬)

public static int[] getMax(int[] arr, int[] retArr) {
    // Return case
    if (retArr[1] >= arr.length - 1)
        return new int[] { Integer.MIN_VALUE, retArr[1] };

    // Save context
    int index = retArr[1];
    int value = arr[index] - arr[index + 1];

    // Call recursion
    retArr[1]++;
    int[] temp = getMax(arr, retArr);

    // Return best between current case and recursive case
    if (temp[0] > value)
        return temp;
    else
        return new int[] { value, index };
}

递归函数的每次调用(或堆栈)都是它自己的上下文。这意味着在其中声明的变量不会在递归调用中被覆盖。这个想法是你递归地分解一个难题,直到你不能进一步分解它。然后,您通过一次将每个呼叫的结果汇总在一起来解决它,直到您得到最终答案。 (这更适用于像斐波那契数列这样不那么琐碎的情况)另外请注意,任何可以在循环中完成的事情总是比递归更有效。

【讨论】:

  • 嗨,谢谢,现在看我的编辑,我不能给函数添加另一个参数,我只能添加一个参数
  • @Evyatar 更新了示例和步骤说明。
  • 你能解释一下它的工作原理吗? @Tezra
  • @Evyatar 我可以试试。更新了答案。为了提供更多帮助,我需要知道您不完全理解的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多