有时候,我们需要枚举一个数组中的所有组合,如从一个数组中取出n个元素的全部组合,这种算法想起来比较容易,做起来却不是那么简单。比如说从数组{1,2,3,4,5}中随机选出两个元素的组合有哪些,随机选出三个元素的组合又有哪些?

比如取三个元素的组合,我的思路是:

取1,2,然后再分别取3,4,5

取1,3,然后再分别取4,5

取1,4,然后取5

这样按照顺序来就可以保证没有重复,我们可以用递归来实现,先从数组中取出一个元素,再从余下的元素中取出一个元素,再从剩下的元素中取出一个元素,按照数组索引大小依次取,避免重复。程序清单如下:

package diguipailie;

/**
 *
 * @author Administrator
 */
public class Diguipailie {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here


    int arr[] = {1, 2, 3, 4, 5, 6};
    int num =3;
    int []result=new int[num];
    combine_increase(arr, 0, result, num, num, arr.length);
  //  return 0;
    }
   public static void combine_increase(int arr[], int start, int result[], int count, int NUM,  int arr_len)
  {
   for (int i = start; i < arr_len + 1 - count; i++)
   {
     result[count - 1] = i;
     if (count - 1 == 0)
     {
       int j;
       for (j = NUM - 1; j >= 0; j--){
       System.out.print(arr[result[j]]+"\t");
       
       }
       System.out.println("\n");
     }
     else
       combine_increase(arr, i + 1, result, count - 1, NUM, arr_len);
   }
 }
}

其中arr为原始数组,start为遍历起始位置,result保存结果,为一维数组,num为要选取的元素个数,arr_len为数组长度,固定值,运行结果如下:

Java 从数组中取出n个元素的所有组合(递归实现)_java