组合问题
2016-02-24 21:39
197 查看
对ABCD进行组合,使用递归思想。
递归逻辑:使用一个和字符串数组相同长度的布尔数组来确定是否选择某一位字符。每次递归有两次递归调用,一个是当前位为true,也就是选择当前这一位的字符,另一个当前位为false,也就是不选择当前这个字符,将选择压力推到下一次递归。
递归函数为public static void f(char[] a,int num,boolean[] x,int start);
start是每次递归开始的位置。
x是一个用来标记被选择的位的布尔数组
代码:
结果:
AB
AC
AD
BC
BD
CD
递归逻辑:使用一个和字符串数组相同长度的布尔数组来确定是否选择某一位字符。每次递归有两次递归调用,一个是当前位为true,也就是选择当前这一位的字符,另一个当前位为false,也就是不选择当前这个字符,将选择压力推到下一次递归。
递归函数为public static void f(char[] a,int num,boolean[] x,int start);
start是每次递归开始的位置。
x是一个用来标记被选择的位的布尔数组
代码:
public static void f(char[] a,int num,boolean[] x,int start){ if(num == 0){//num等于0,出口条件成立,此时的这个函数中的x数组已经有了选择,对x进行判断即可输出这个组合 for(int i = 0; i < start; i++){ if(x[i]){ System.out.print(a[i]); } } System.out.println(); return; } if(start == a.length){//另一个出口条件,start达到数组尾部时,num还没有减到0,就可以放弃这个分支了。 return; } x[start] = true;//标记当前位为true,也就是选择这个位的字母 f(a,num-1,x,start+1);//已经选择了一位,所以num减一。每次递归,start都要加1 x[start] = false;//标记当前位为false,也就是不选择这个位的字母,将余下的位交给下一次递归 f(a,num,x,start+1);//没有选择当前位,num不减一 } public static void main(String[] args) { char[] a = "ABCD".toCharArray(); boolean[] x = new boolean[a.length]; f(a,2,x,0);//第一次调用,从ABCD中选择2个字母组合,位置为0,x全部初始化为false }
结果:
AB
AC
AD
BC
BD
CD
相关文章推荐
- CompletableFuture(三)
- 正确使用优惠券,才能带你赚钱带你飞
- Atitit.jsou html转换纯文本 java c# php
- jdbc连接数据库工具类
- python模块系列之 - configparser
- day14
- Android Socket网络通信
- Android 之百度推送
- TabHost详细解析
- Atitit.jsou html转换纯文本 java c# php
- Atitit.jsou html转换纯文本 java c# php
- C++11之move语义
- java static的用法
- 2016-2-24日学习记录
- atitit.基于bat cli的插件管理系统.doc
- Python扩展内置类型
- 进程与线程的区别
- atitit.基于bat cli的插件管理系统.doc
- atitit.基于bat cli的插件管理系统.doc
- Java7的新IO,NIO2