功能:对于数组[1, 2, 3, 4, 5],打印出所有可能的组合方式
比如:在1, 2, 3, 4, 5中,选取3个数到底有多少种组合呢?
解决方案:先选取一个数,然后在剩下的4个数中选取2个数,接着在剩下的3个数中选取1个数。。.直到选取0个数结束递归。。。然后,外面套个循环,就能得出数组1, 2, 3, 4, 5所有的可能组合方式。
参考链接
public class test1 {
public static void digui(int [] nums) {
for(int i = 1; i <= nums.length; i++) {
int out[] = new int[i];
helper(nums, nums.length, i, out, i);
}
}
public static void helper(int[] input, int inputlen, int m, int [] out, int outlen) {
//函数的含义是:获取数组input前inputLen部分的长度为m的组合数,并存储到out数组中
//@input 输入待组合的数据,本例是{0,1,2,3,4},数字代表数组的位置
//@inputLen 截取input的前inputLen部分,比如inputLen=3,则截取input为{0,1,2}
//@m 获取长度为m的组合,比如m=2,inputLen=3,则可能的情况有:{0,1}{0,2}{1,2}
//@out 最后可能组合的结果。比如最开始输入,m=3,则out可能为{1,2,3}{1,2,4}等
//@outLen out的长度
//循环结束条件
if (m == 0) {
for(int i = 0; i < outlen; i++) {
System.out.print(out[i]);
System.out.print("->");
}
System.out.println();
return;
}
//注意循环范围是inputlen---->m
//你要选取m个数,所以你的i值(inputlen,前i个数)肯定得>=m
for(int i = inputlen; i >= m; i--) {
//注意这里是从后面取的数
out[m-1] = input[i-1];
//递归,同时更新inputlen和m
helper(input, i - 1, m - 1, out, outlen);
}
}
public static void main(String[] args) {
int[] nums = new int[5];
for(int i = 0; i < nums.length; i++) {
nums[i] = i + 1;
}
digui(nums);
}
}
打印输出结果:
5->
4->
3->
2->
1->
4->5->
3->5->
2->5->
1->5->
3->4->
2->4->
1->4->
2->3->
1->3->
1->2->
3->4->5->
2->4->5->
1->4->5->
2->3->5->
1->3->5->
1->2->5->
2->3->4->
1->3->4->
1->2->4->
1->2->3->
2->3->4->5->
1->3->4->5->
1->2->4->5->
1->2->3->5->
1->2->3->4->
1->2->3->4->5->