在数学中,咱们学习了,排列组合,排列是有序的,组合是无顺序的。在作算法题时,咱们也会遇到这种。
so,今天来理下,怎么写组合。java
举个例子,桌子上有3个球A,B,C,咱们取2个,无放回的取,有几种状况?算一下:也就是C(3,2)=3。算法
那么先理下思路,咱们须要解决哪几个问题:数组
int a = {0,0,0}
,若是他被取了,就把它置为1,三个int分别表明ABC。第一步,咱们已经解决了,怎么表示球被取出来了。
第二步,组合:
咱们想下,如下场景:函数
那么定义一个函数,它的做用是从a中取球,取到知足条件输出组合。再定义一个index,表示我取得是哪个球。以后,咱们取球,若是要选,把a[index]置为1,参数curr表示已经取了多少个球,因此也须要+1,而后再去取下一个球。如此反复。学习
固然咱们也能够不取这个球,不取这个球,就要把它置为0,可是须要index++,由于不取这个球,那仍是须要去取下一个球,好比不取A,可是咱们仍是要去BC。code
紧接着找到递归出口,也就是取完2个球,或者3个球都被取完了。获得以后,就把它打印出来。也就是调用show(a[])方法。递归
show方法:遍历i数组,若是a[i]==1,即咱们取了,就把他输出。(char)('A'+i)+" "
这也是个小细节。索引
/*从5个小球中取出三个小球*/ public class 组合 { static int count; //很明显是一个组合问题,不用考虑排列,排列的话,就能够用全排列 public static void main(String[] args) { int a[] = {0,0,0}; method1(a,0,2,0); System.out.println(count); } /** * 做用: 从a中取球,取到2个球有哪几种组合 * * @param a 数组a表示当前被选中的数 * @param index 当前被选中的数的索引 * @param sum 要选中多少个数 * @param curr 当前已经选中了多少个数 */ private static void method1(int a[], int index, int sum, int curr) { if (curr == sum){ show(a); count++; return; } //若是数组都选完了,就不能选了,之因此index == a.length,是由于最后一个也要被选 if (index == a.length){ return; } //当前位置要选,将这个位置改成1 a[index] = 1; //判断下一个数是否要选 method1(a,index+1,sum,curr+1); //当前这个位置不选,将这个位置改成0 a[index] = 0; method1(a,index+1,sum,curr); } private static void show(int[] a) { for (int i =0; i < a.length;i++){ if (a[i] == 1 ){ System.out.print((char)('A'+i)+" ");//变成char与int相加为int,因此再把它变成char } } System.out.println(); } }