hello,

pour résoudre le problème on peut aussi utiliser une fonction récursive comme ceci par exemple :
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
33
34
35
def calcCombi(combi, elements, maxi, somme, cible):
    # on regarde si on a atteint la cible
    if somme == cible:
        affichage(combi, elements)
        return
    # on a dépassé
    if somme > cible:
        return
 
    for valeur in elements:
        if valeur >= maxi:
        # on copie la liste, puis on ajoute la valeur courante.
            copie = combi[:]
            copie.append(valeur)
        # Recursivement on ajoute plus de combinaisons.
            calcCombi(copie, elements, valeur, somme + valeur, cible)
 
def affichage(combi, elements):
    global nb
    # on affiche une solution ,
    nb = nb + 1
    for element in elements:
        count = combi.count(element)
        print(count," x ",element, "€ - ", end="")
    print ("")
 
# liste de combinaison de pièces et de billets
combi = []
# billets ou pièces dont on dispose
elements = [2, 5, 10]
# variable globale du nombre de possibilités
nb = 0
# départ.
calcCombi(combi, elements, 0, 0, 100)
print ("nombre de possibilités : ",nb)
Pour qu'une fonction récursive fonctionne, il faut une condition d'arrêt de la récursion. Ici c'est quand on atteint ou dépasse la cible. En python, il y a une profondeur max de récursion (à cause de la taille de la pile) c'est 1000 par défaut. On peut augmenter cette valeur par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
import sys
sys.setrecursionlimit(x)
La fonction calcCombi dans l'exemple est appelée 2671 fois.
La profondeur max de récursion atteinte ici est de 50 ( cas où l'on utilise que des pièces à 2 euros)

Ami calmant, J.P