簡體   English   中英

數組中兩個值之間的差的遞歸函數

[英]Recursive function to difference between two values in array

我正在使用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)的第二個參數,而且我不能使用靜態變量

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 };
}

遞歸函數的每個調用(或堆棧)都是其自己的上下文。 這意味着在其中聲明的變量不會在遞歸調用中被覆蓋。 這個想法是,您可以遞歸地分解一個難題,直到無法進一步分解為止。 然后,您可以一次將每個呼叫的結果匯總在一起,直到最終答案得到解決。 (這對於非平凡的情況(例如斐波那契數列)更有效)另外請注意,可以在循環中完成的所有操作都將比遞歸更有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM