组合问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合问题相关的知识,希望对你有一定的参考价值。

  对ABCD进行组合,使用递归思想。

递归逻辑:使用一个和字符串数组相同长度的布尔数组来确定是否选择某一位字符。每次递归有两次递归调用,一个是当前位为true,也就是选择当前这一位的字符,另一个当前位为false,也就是不选择当前这个字符,将选择压力推到下一次递归。

递归函数为public static void f(char[] a,int num,boolean[] x,int start);

    start是每次递归开始的位置。

    x是一个用来标记被选择的位的布尔数组

代码:

 1     public static void f(char[] a,int num,boolean[] x,int start){
 2         if(num == 0){//num等于0,出口条件成立,此时的这个函数中的x数组已经有了选择,对x进行判断即可输出这个组合
 3             for(int i = 0; i < start; i++){
 4                 if(x[i]){
 5                     System.out.print(a[i]);
 6                 }
 7             }
 8             System.out.println();
 9             return;
10         }
11         if(start == a.length){//另一个出口条件,start达到数组尾部时,num还没有减到0,就可以放弃这个分支了。
12             return;
13         }
14         x[start] = true;//标记当前位为true,也就是选择这个位的字母
15         f(a,num-1,x,start+1);//已经选择了一位,所以num减一。每次递归,start都要加1
16         x[start] = false;//标记当前位为false,也就是不选择这个位的字母,将余下的位交给下一次递归
17         f(a,num,x,start+1);//没有选择当前位,num不减一
18     }
19     
20     public static void main(String[] args) {
21         char[] a = "ABCD".toCharArray();
22         boolean[] x = new boolean[a.length];
23         f(a,2,x,0);//第一次调用,从ABCD中选择2个字母组合,位置为0,x全部初始化为false
24     }

结果:

AB
AC
AD
BC
BD
CD

以上是关于组合问题的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 代码片段

48个值得掌握的JavaScript代码片段(上)

片段组合在 Relay 中是如何工作的?

如何像浏览器一样在 Java 中组合 URL 片段?

使用 Apollo 客户端的片段组合:约定和样板

为 memcached 和 Rails 组合片段和对象缓存的最佳方式