2013-03-27 89 views
2

我會通過說這是作業。我只是在尋找一些指針。我一直在用這種方式來摧毀我的大腦,而對於我來說,我只是沒有得到它而已。我們被要求在列表中找到最小元素。我知道我在這裏需要一個子列表,但之後我不確定。任何指針都會很棒。謝謝。Java:遞歸查找列表中的最小元素

/** Find the minimum element in a list. 
* 
* @param t a list of integers 
* 
* @return the minimum element in the list 
*/ 
    public static int min(List<Integer> t) { 
    if (t.size() == 1){ 
    return t.get(0); 
    } 
    else{ 
     List<Integer> u = t.subList(1, t.size()); 
+1

請記住,你必須在某個時候進行比較。 – 2013-03-27 02:28:03

+1

它會很貴,爲什麼不說元素0小於元素1,返回列表中的最小值1,否則返回列表中的最小值,0刪除 – 2013-03-27 02:28:09

+0

另一個基於前兩個註釋的提示。 。也許你應該有另一個基本情況,其中列表的大小是2.在這種情況下,你會返回兩個元素中較小的一個。否則,您會將第一個元素與「_list_的其餘部分」中的最小元素進行比較。 – jahroy 2013-03-27 02:30:11

回答

0

從最普遍的意義上說,遞歸是一個基於分解工作的概念,然後將較小的一部分工作委派給自己的副本。爲了遞歸工作,您需要三件主要事情:

  1. 工作細分。你如何使每一步「更簡單」?
  2. 遞歸調用。在某些時候,你的功能必須自己調用,但是用較少的「工作」。
  3. 基本案例。什麼是(通常微不足道的)最終情況會停止遞歸過程?

對於您的情況,您嘗試創建一個功能min,該功能在列表上運行。你認爲你可以通過使列表每次更小(列出第一個元素)來減少(分解)你的工作是正確的。正如其他人所提到的,這個想法是檢查第一個元素(你剛剛取消)與「其餘列表」。那麼這就是信仰的飛躍。在這一點上,你可以「假設」你的min函數將在子列表上工作,並且只需在子列表上進行函數調用(遞歸調用)即可。現在你必須確保所有的通話都會返回(即確保它不會永久遞歸)。這就是你的基本情況。如果你的列表大小爲1,唯一的元素是列表中最小的。無需再次致電min,只需返回(您原始文章中已有的部分)。

+0

「遞歸是一個基於分解工作的概念」 - >也被稱爲「分而治之「策略。 – Vincent 2013-03-27 03:16:05

+0

非常感謝你們! – user1805052 2013-03-27 03:29:32

3

遞歸算法的一點是,必須計算的所有內容都是通過返回值或附加參數完成的。除遞歸步驟的本地調用之外,您不應該有任何東西。

因爲你必須要找到的最小元素,你應該採取的一些注意事項:

  • 一個由一個元素組成的列表的最小元素是元素
  • 泛型列表的最小單元是最小在第一個元素和其餘列表的最小值之間

考慮到這些因素,應該很容易實現。特別是因爲遞歸算法具有與其算法描述非常相似的便利。

1

您需要找到應用於列表的函數min與應用於子列表的函數min之間的關係。

分鐘([A B C dé...])= F(A,分鐘([B C dé...]))

現在,你只需要找到函數f。一旦你有了這種關係,那麼執行它就很容易。祝你好運。

0

你去那裏,在方法嘗試了這一點:

public static Integer minimum(List<Integer> t) { 
     int minInt; 
     if (t.size() == 1) { 
     return t.get(0); 
     } else { 
      int first = t.get(0); 
      List<Integer> u = t.subList(1, t.size()); 
      minInt = Math.min(first, u.get(0)); 
      minInt = IntegerList.minimum(u); 
      } 
     return minInt; 
     } 

希望這能解決您的問題。