[英]Finding the minimum in a given array using recursion
我不太了解以下遞歸函數。 這是整個代碼:
public class Minimum {
static int minimum(int [] array, int z, int k) {
if (z == k)
return array[z];
int s = (z + k) / 2;
int min1 = minimum(array, z, s);
int min2 = minimum(array, s+1, k);
return Math.min(min1, min2);
}
public static void main(String[] args) {
int [] array = {4,5,7};
int min = minimum(array, 0, array.length-1);
System.out.println(min);
}
}
我將嘗試解釋我對它的工作方式的看法。
如果數組中只有一個元素,則返回該元素(如果只有1個元素,則返回0 == array.length -1)
if (z == k)
return array[z];
我了解我們可以通過以下代碼找到均值,對嗎?
int s = (z + k) / 2;
通過使用以下行,我認為我們只檢查數組中數字的前一半(直到平均值)?
int min1 = minimum(array, z, s);
以下代碼是否用於檢查數組的另一半?
int min2 = minimum(tabela, s+1, k);
現在,我們調用Math.min函數以獲取數組中的最小數字
return Math.min(min1, min2);
讓我們a = [2,4,7,1]
代碼開始思考,讓我們找出數組a = [2,4,7,1]
的最小值。
那么,使用分而治之技術,我們可以說,發現的最小a
是相同的發現最小的陣列的兩半:
min([2,4,7,1]) = min(min([2,4]), min([7,1]))
我們可以再做一次
min([2,4,7,1])
= min(min([2,4]), min([7,1]))
= min(min(min([2]),min([4])), min(min([7]),min([1])))
現在我們有了除法的終止情況,單個元素的min
就是那個元素 ,再次將其分解:
min(min(min([2]),min([4])), min(min([7]),min([1])))
= min(min(2,4), min(7,1))
= min(2, 1)
= 1
魔法。
那么,您顯示的代碼如何工作?
static int minimum(int [] array, int z, int k) {
//if the we are examining the sub array consisting of one element
if (z == k) {
//the minimum of the array is that element
return array[z];
}
//find the mid point of the array - also the mean of the two numbers, but that's not really relevant
int s = (z + k) / 2;
//find the minimum of the first half, by calling this function
int min1 = minimum(array, z, s);
//find the minimum of the second half, by calling this function
int min2 = minimum(array, s+1, k);
//return the smaller of the two halves
return Math.min(min1, min2);
}
因此,使用上面的示例遍歷代碼:
minimum([2,4,7,1], 0, 3)
顯然z != k
,所以我們拆分數組:
s = (0 + 3)/2 = 1 //due to integer division
所以我們稱:
int min1 = minimum([2,4,7,1], 0, 1);
int min2 = minimum([2,4,7,1], 2, 3);
這又將其再次拆分,這次是終止情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.