Bonjour à tous,
Je travaille sur un algorithme qui me permet de générer toutes les distributions de valeurs possibles pour une combinaison, en fonction du nombre de valeurs et de la longueur de la combinaison.
Cette fonction donne toutes les distributions possibles, pour n valeurs possibles et une combinaison de longueur x.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /** * @param int $nb_tiroirs Le nombre de tiroirs qu'il reste à placer entre les chaussettes. * @param int $nb_chaussettes Le nombre de chaussettes qui ne sont pas encore dans un tiroir. * @param array $tiroirs Les nombres de chaussettes dans chacun des tiroirs déjà placés. * @return Les combinaisons possibles. */ function create_combinaisons($nb_tiroirs, $nb_chaussettes, $tiroirs = array()) { if ($nb_tiroirs == 1) { $tiroirs[] = $nb_chaussettes; return array($tiroirs); } $combinaisons = array(); // $tiroir est le nombre de chaussettes dans le tiroir suivant for ($tiroir = 0; $tiroir <= $nb_chaussettes; $tiroir++) { $combinaisons = array_merge($combinaisons, create_combinaisons( $nb_tiroirs - 1, $nb_chaussettes - $tiroir, array_merge($tiroirs, array($tiroir)))); } return $combinaisons; } // Utilisation pour 3 entrées parmi 5 valeurs $combinaisons = create_combinaisons(5, 3); // Affichage foreach ($combinaisons as $combinaison) { var_dump($combinaison); }
Par exemple :
Aujourd'hui je cherche à générer toutes les distributions possibles à partir d'une distribution et du nombre de valeurs en commun avec elle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 distributions_possibles(3,3); // Output : 003 012 021 030 102 111 120 201 210 300
Par exemple :
- 012 et 2 valeurs donnera les solutions suivantes : 011, 002
- 0211 et 2 valeurs donnera : 0110, 0200, 0011, 0101
- 03110 et 3 valeurs donnera : 03000, 01110, 02100, 02010
- 03110 et 2 valeurs donnera : 02000, 01100, 00110, 01010
Ne maitrisant pas bien la récursivité de ma fonction (j'ai été aidé), je n'arrive pas à l'adapter pour obtenir cette nouvelle génération.
Si vous avez des pistes je suis preneur.
Partager