Java中求集合组合的递归算法

Java中求集合组合的递归算法,java,recursion,combinations,Java,Recursion,Combinations,我试图找到一些关于如何在Java中找到给定集合(可能是字符串或整数数组)的所有组合的示例。我发现了这段代码(在中找到。我只复制了这里的相关部分): 但是,我真的不明白它是如何工作的。有人愿意解释一下吗?创建给定集合的所有组合非常简单。您有N个元素,在每个组合中,一个元素存在或不存在,因此您有2^N个组合。递归函数正是这样做的。它从列表中选择每个元素,并创建包含它的组合,并创建不包含的组合。注意:它不会打印出空的组合 如果仍然不清楚,创建一个简短的测试字符串(例如:3个字符),启动一个调试器,看看

我试图找到一些关于如何在Java中找到给定集合(可能是字符串或整数数组)的所有组合的示例。我发现了这段代码(在中找到。我只复制了这里的相关部分):


但是,我真的不明白它是如何工作的。有人愿意解释一下吗?

创建给定集合的所有组合非常简单。您有N个元素,在每个组合中,一个元素存在或不存在,因此您有2^N个组合。递归函数正是这样做的。它从列表中选择每个元素,并创建包含它的组合,并创建不包含的组合。注意:它不会打印出空的组合


如果仍然不清楚,创建一个简短的测试字符串(例如:3个字符),启动一个调试器,看看它是如何工作的。

Java程序从main开始。这个参数应该是一个整数。它将整数存储为N。如果用户在java中键入且程序名为
3
,则N将设置为3。这用于剥离字母表的前N个字母,并将它们放入元素中。(在我们的示例中,
abc
)。然后它调用comb1(
abc
),即首先列出的公共comb1

接下来,comb1使用两个参数调用私有comb1,一个空字符串和
abc

现在递归开始了。Private comb1采用前缀和字符串(在第一种情况下为空字符串和
abc
)。如果字符串不是空的,则它:

  • 打印第一个字符
  • 以前缀+第一个字符作为新前缀,剩余字符作为新字符串和
  • 使用与新前缀相同的前缀以及除第一个字符以外的所有字符作为新字符串递归调用自身
  • (在这里,很多人都会微微发抖……盯着它,坚持住,做电脑,意义就会显现。)


    这是您遇到问题的代码,还是基本原则?你可能想要拿一支铅笔和一张纸,然后浏览一个小样本。从N=2开始,遵循代码对“abc”的作用。
    // 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();
    }
    
    (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)