组合问题

  对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

posted @ 2016-02-24 21:39  Travis_007  阅读(159)  评论(0编辑  收藏  举报