繁体   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