我不太了解下面的递归函数。这是完整的代码:
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);
}
}
我会尝试解释我对自己认为有效的看法。
如果数组中只有一个元素,我们返回该元素(0 == array.length -1,如果只有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);
答案 0 :(得分:6)
让我们在没有代码的情况下考虑这个问题,让我们找到数组a = [2,4,7,1]
的最小值。
好吧,使用divide and conquer技术,我们可以说找到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);
反过来又分裂了这次,这次是终止案例。