1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public static void main(String[] args) {
int n=49;
int k=5;
combinaisons(n,k).stream().map(Arrays::toString).forEach(System.out::println);
}
/**
* Détermine la liste des combinaisons de k nombres choisis parmi les nombres de 1 à n inclus.
*/
public static Collection<int[]> combinaisons(int n, int k) {
if ( n<0 || k<0 || k>n ) throw new IllegalArgumentException();
List<int[]> list = new ArrayList<>(); // pour stocker toutes les combinaisons
int[] array = new int[k]; // pour construire une combinaison (le tableau sera recyclé pour généré toutes les combinaisons et copié au moment du stockage dans list)
combinaisons(list, array, 1, n, 0); // on lance la recherche des combinaisons à partir du premier numéro (1) et en commençant en position 0 dans la combinaison
return list;
}
/**
* @param list pour stocker toutes les combinaisons
* @param array pour construire une combinaison
* @param p le premier des nombres à choisir
* @param n le dernier des nombres à choisir
* @param j l'endroit dans le tableau où stocker le prochain nombre choisi
*/
private static void combinaisons(List<int[]> list, int[] array, int p, int n, int j) {
if ( j<array.length ) { // on n'est en train de choisir un "numéro"
for(int i=p; i<=n; i++) { // on parcourt les "numéros" suivants le précédent choisi
array[j] = i; // on stocke dans la combinaison
combinaisons(list, array, i+1, n, j+1); // on cherche la suite de la combinaison
}
}
else { // on a une combinaison complète, on la stocke
list.add(Arrays.copyOf(array, array.length));
}
} |
Partager