[英]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.