Algorithme de répartition
Bonjour je voudrais réaliser un algorithme récursif en fonctionnel qui calcule le nombre de manières de donner n objets à x personnes.(je suis restreint à une seule fonction)
Exemple: j'ai 3 personne(a,b,c) et 2 objets alors je peux distribuer ses objets ainsi
a b c
2 0 0
1 1 0
0 1 1
1 0 1
0 2 0
0 0 2
La fonction me retournerait donc 6.
Si quelqu'un a une idée... ça fait un bail que j'essai de résoudre ce problème(je suis novice).
Merci d'avance.
1 pièce(s) jointe(s)
Algorithme de répartition
Bonjour, :D
La liste des distributions d'un nombre (X) donné d'objets entre (N) personnes s'obtient sans difficulté sur des exemples particuliers.
Cependant le programme comporte (X) boucles imbriquées, et l'on comprend que le dénombrement dans le cas général contraint d'employer un procédé récursif.
La comparaison des listes permet de remonter par induction à la filiation qui les relie, donc à la relation de récurrence qui débouche sur la récursivité.
Les listes ci-dessous, par exemple, correspondent à la répartition de 1, 2, 3 ou 4 objets entre 5 personnes; les nombres de distributions obtenues valent respectivement 5, 15, 35 et 70.
Pièce jointe 314481
On a représenté en rouge les distributions particulières, pour lesquelles tous les objets sont attribués à la même personne.
Chaque liste L(5, X) peut se déduire de l'une des précédentes L(5, X - 1) par attribution d'un objet supplémentaire à partir du dernier terme non-nul, et en allant vers la droite (dans le sens de la liste). Voilà ce qui devrait ouvrir une piste, pour la mise au point du programme cherché.
La simple mise en ligne des valeurs obtenues (5, 15, 35, 70, 126, 210) livre une multitude d'informations, quant aux résultats cherchés.
Voir Wikipedia, et The On-Line Encyclopedia of Integer Sequences
1 pièce(s) jointe(s)
Algorithme de répartition
Toute répartition de (x) objets entre (n) personnes, dont (k) pour la dernière, implique la répartition préalable de (x - k) objets sur les (n - 1) personnes précédentes, ce qui doit se traduire par:
F(n, x) = F(n-1, x)(k=0) + F(n-1, x-1)(k=1) + F(n-1, x-2)(k=2) ... + F(n-1, x-k)(k < x) + ... + F(n-1, 0)(k=x)
ou encore: F(n, x) = Sk=0x(F(n-1, x-k)) = Sh=0x(F(n-1, h)) (par changement de l'indice muet).
En ajoutant les résultats simples et évidents:
F(n, 0) = 1 ; F(n, 1) = n ; F(1, x) = 1 pour tout (n>0) et (x>=0) ,
l'écriture d'un algorithme récursif devient possible, puisque la régression des variables entières conduit à un nombre fini de calculs (~ n*x , au maximum).
Un petit programme non récursif, mais utilisant la précédente relation de récurrence, conduit au tableau de résultats suivant - pour (n) personnes (en colonne) et (x) objets (en ligne):
Pièce jointe 322930
Chacun aura reconnu :D le coefficient binômial (Cn+x-1x) .