使用递归查找给定数组中的最小值

时间:2015-04-19 12:05:34

标签: java 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);
  }
}

我会尝试解释我对自己认为有效的看法。

如果数组中只有一个元素,我们返回该元素(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);

1 个答案:

答案 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);

反过来又分裂了这次,这次是终止案例。