java - 在Java中查找集合组合的递归算法

标签 java recursion combinations

我试图找到一些示例,说明如何在 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 - 在Java中查找集合组合的递归算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6966137/

相关文章:

c++ - 组合的快速排名/取消排名(64 位)

java - 如何使用协调器布局将 View 折叠到屏幕底部?

c++ - 如何从 .t​​xt 文件中读取以确定二维数组的大小?

java - Eclipse 指向依赖项中的错误路径

c - 将指针传递给头指针,void insertNode 函数?

javascript - 递归 javascript 函数返回详细信息

python - 元组列表的唯一组合

ruby - 什么是最像 Ruby 的生成 3 个正整数加起来等于 100 的唯一组合的方法

java - eclipse osgi : how to load class from a specific bundle

java - 如何在Service中访问FragmentManager?