簡體   English   中英

使用遞歸查找給定數組中的最小值

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

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