簡體   English   中英

遞歸算法,用於查找Java中集合的組合

[英]Recursive Algorithm to find Combinations of a set in Java

我試圖找到一些示例,說明如何找到Java中所有組合的給定集合(可能是字符串或整數數組)。 我遇到了這段代碼(位於http://introcs.cs.princeton.edu/java/23recursion/Combinations.java.html中 。我僅在此處復制了相關部分。):

// print all subsets of the characters in s
public static void comb1(String s) { comb1("", s); }

// print all subsets of the remaining elements, with given prefix 
private static void comb1(String prefix, String s) {
    if (s.length() > 0) {
        System.out.println(prefix + s.charAt(0));
        comb1(prefix + s.charAt(0), s.substring(1));
        comb1(prefix,               s.substring(1));
    }
}  

// read in N from command line, and print all subsets among N elements
public static void main(String[] args) {
   int N = Integer.parseInt(args[0]);
   String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
   String elements = alphabet.substring(0, N);

   // using first implementation
   comb1(elements);
   System.out.println();
}

但是,我真的不明白它是如何工作的。 有人願意解釋嗎?

創建給定集合的所有組合非常簡單。 您有N個元素,在每個組合中一個元素都存在或不存在,因此您有2 ^ N個組合。 該遞歸函數正是這樣做的。 它從該列表中選取每個元素,並創建包含該元素的組合,並創建不包含該元素的組合。 注意:它不會打印出空組合。

如果仍然不清楚,請創建一個簡短的測試字符串(例如3個字符),啟動調試器,然后查看其工作原理。

Java程序從main開始。 該參數采用一個整數。 它將整數存儲在N中。如果用戶輸入java並使用3表示程序名稱,則N將設置為3。這用於剝離字母的前N個字母並將它們放在元素中。 (在我們的示例中, abc )。 然后,它調用comb1( abc ),即首先列出的公共comb1。

接下來,comb1用兩個參數調用私有的comb1,一個空字符串和abc

現在開始遞歸。 專用comb1帶有一個前綴和一個字符串(在第一種情況下為空字符串和abc )。 如果字符串不為空,則它:

  1. 打印第一個字符
  2. 以前綴+第一個char作為新的前綴,其余部分作為新的字符串,遞歸調用自身
  3. 以與新前綴相同的前綴遞歸調用自身,除第一個字符外的所有字符均作為新字符串。

(在這里許多人會略微發抖……凝視它,掛着,成為計算機,然后含義就會出現。)

(Top level)
comb1("", "abc") -> *1* a   *2* comb1("a", "bc") *3* comb1("", "bc")

(Second level)
comb1("a", "bc") -> *1* ab  *2* comb1("ab", "c") *3* comb1("a", "c")
comb1("", "bc")  -> *1* b   *2* comb1("b", "c")  *3* comb1("", "c")

(Third level)
comb1("ab", "c") -> *1* abc *2* comb1("abc", "") *3* comb1("ab", "")
comb1("a", "c")  -> *1* ac  *2* comb1("a", "")   *3* comb1("a", "")

comb1("b", "c")  -> *1* bc  *2* comb1("bc", "")  *3* comb1("b", "")
comb1("", "c")   -> *1* c   *2* comb1("c", "")   *3* comb1("", "")

(Fourth level)
comb1("ab", "") -> (immediate return, ending recursion) 
comb1("a", "") -> (immediate return, ending recursion)
comb1("b", "") -> (immediate return, ending recursion)
comb1("", "") -> (immediate return, ending recursion)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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