1. 程式人生 > >M個數選K個數排列

M個數選K個數排列

pan lis ati col else list system 可能 static

題目:從1到n個數中,取出k個數,列出所有組合。
舉例,從數字1-5中取三個數的所有可能組合(數字不重復,忽略順序)為:(5 4 3 ),(5 4 2 ),(5 4 1),(5 3 2 ),(5 3 1 ),(5 2 1 ),(4 3 2 ),(4 3 1 ),(4 2 1 ),(3 2 1)。其中n=5,k=3

即首先選擇n,然後遞歸地從剩下的1...n-1選擇k-1個數,然後選擇n-1,然後遞歸地從剩下的1...n-2選擇k-1個數,直到選到k。

遞歸代碼:

n個數 取k個數 存放在d 一個選出num個數

 1     //N個數取K個數
 2     public static
void getNK(int n,int k,List<Integer> d,int num){ 3 4 int i = n; 5 if(k>n) return; 6 //設置第一層的數字 第一層的數字只能是 5 4 3 7 while(i>=k){ 8 d.set(num-k, i); 9 //k>1代表取出數字不足,k=1時剛好取出k個數 10 if(k>1) getNK(i-1,k-1,d,num);
11 else{//取完了 12 System.out.println(d.toString()); 13 } 14 i--; 15 } 16 }

M個數選K個數排列