問題は次のように分解できます:
1. 最初に n 個の数値から最大の数値を選択し、次に残りの n-1 個の数値から m-1 個の数値を選択し、n-(m-1) 個の数値が 1 になるまで選択します。番号が選択されています。
2. n 個の数値から次に小さい数値を選択し、オプションの最大の数値が m になるまでステップ 1 を続けます。
明らかに、上記のメソッドは再帰的プロセスです。つまり、再帰的メソッドを使用すると、すべての組み合わせを非常にきれいに取得できます。
コード:
package algorithm.ms100; public class CtzHe { private int[] array = {1,2,3,4,5}; private int[] b= new int[3]; private int M = 3; public void combine( int a[], int n, int m) { for(int i=n; i>=m; i--) // 注意这里的循环范围 { b[m-1] = i - 1; if (m > 1) combine(a,i-1,m-1); else // m == 1, 输出一个组合 { for(int j=M-1; j>=0; j--) System.out.print( a[b[j]] + " "); System.out.println(); } } } public static void main(String[] args) { CtzHe c = new CtzHe(); c.combine(c.array, 5, 3); } }