Ci joint avec un accumulateur:
def pile_poil(n,taille,acc=[]):
if taille==1:
yield acc+[n]
else:
for i in range(n+1):
yield from pile_poil(n-i,taille-1,acc+[i])
def affiche_somme(n,taille):
for i,liste in enumerate(pile_poil(n,taille)):
print(i,liste,sum(liste))
affiche_somme(10,3)
Ca donne:
0 [0, 0, 10] 10
1 [0, 1, 9] 10
2 [0, 2, 8] 10
3 [0, 3, 7] 10
4 [0, 4, 6] 10
5 [0, 5, 5] 10
6 [0, 6, 4] 10
7 [0, 7, 3] 10
8 [0, 8, 2] 10
9 [0, 9, 1] 10
10 [0, 10, 0] 10
11 [1, 0, 9] 10
12 [1, 1, 8] 10
13 [1, 2, 7] 10
14 [1, 3, 6] 10
15 [1, 4, 5] 10
16 [1, 5, 4] 10
17 [1, 6, 3] 10
18 [1, 7, 2] 10
19 [1, 8, 1] 10
20 [1, 9, 0] 10
21 [2, 0, 8] 10
22 [2, 1, 7] 10
23 [2, 2, 6] 10
24 [2, 3, 5] 10
25 [2, 4, 4] 10
26 [2, 5, 3] 10
27 [2, 6, 2] 10
28 [2, 7, 1] 10
29 [2, 8, 0] 10
30 [3, 0, 7] 10
31 [3, 1, 6] 10
32 [3, 2, 5] 10
33 [3, 3, 4] 10
34 [3, 4, 3] 10
35 [3, 5, 2] 10
36 [3, 6, 1] 10
37 [3, 7, 0] 10
38 [4, 0, 6] 10
39 [4, 1, 5] 10
40 [4, 2, 4] 10
41 [4, 3, 3] 10
42 [4, 4, 2] 10
43 [4, 5, 1] 10
44 [4, 6, 0] 10
45 [5, 0, 5] 10
46 [5, 1, 4] 10
47 [5, 2, 3] 10
48 [5, 3, 2] 10
49 [5, 4, 1] 10
50 [5, 5, 0] 10
51 [6, 0, 4] 10
52 [6, 1, 3] 10
53 [6, 2, 2] 10
54 [6, 3, 1] 10
55 [6, 4, 0] 10
56 [7, 0, 3] 10
57 [7, 1, 2] 10
58 [7, 2, 1] 10
59 [7, 3, 0] 10
60 [8, 0, 2] 10
61 [8, 1, 1] 10
62 [8, 2, 0] 10
63 [9, 0, 1] 10
64 [9, 1, 0] 10
65 [10, 0, 0] 10