Bonjour,
Je tente un programme probablement tout bête, mais pour moi qui n’ai jamais travaillé concrètement sur des arbres, je me retrouves à faire des trucs bizarres avec des résultats innatendus.
Mon but : partant d’une liste de nombre, mettons [1, 2, 3], je veux toutes les combinaisons d’opérations élémentaires possibles de ces nombres. Oublions * et /, faisons juste + et -. Je veux donc
1 + 2 + 3
1 + 2 - 3
1 - 2 + 3
1 - 2 - 3
...
Il faudra aussi faire toutes les permutation (car priorité d’opération avec * et /), mais je verrai ça pus tard. J’ai utilisé une fonction récursive et des yield
, mais tout ne se passe pas comme prévu :
def combinaison(nb, ll_nb):
"""Fait les 4 opérations entre nb et le premier élemnt de ll_nb.
Et itère."""
print(nb, ll_nb)
if len(ll_nb) == 1:
yield [i for i in [nb + ll_nb[0]]]
yield [i for i in [nb - ll_nb[0]]]
else:
yield [i for i in combinaison(nb + ll_nb[0], ll_nb[1:])]
yield [i for i in combinaison(nb - ll_nb[0], ll_nb[1:])]
# Appel de la fonction avec gestion
tous_les_nombres = []
for i in liste_nombre:
ll_inter = liste_nombre.copy()
ll_inter.remove(i)
for j in combinaison(i, ll_inter.copy()):
tous_les_nombres += j
print("Tous les nombre obtenus : ", tous_les_nombres)
## Tous les nombre obtenus : [[6], [0], [2], [-4], [6], [0], [4], [-2], [6], [2], [4], [0]]
Je voudrai me débarrasser des listes. Faire un simple flat
n’est pas suffisant, car dès que l’on a plus de nombres, j’ai des listes de listes de listes de…
J’imagine que j’ai mal fait mon truc, et que les yield [i for i in ... ]
que j’ai ajouter pour forcer l’expression des générateurs peuvent être gérés autrement.
Une idée de la part de plus pytoniste que moi ?
Merci.