Salut à toutes et à tous !
Je dois générer un gros paquets de combinaisons.
L'algorithme que j'essaie d'implémenter a été implémenté en Ruby et Python, et tous deux y font l'usage intensif de générateurs (le mignon yield). J'essaie de traduire le code en C++, sauf que les générateurs ne semblent pas supportés par C++.
Mes recherches sur internet portent sur deux manières de faire (qui sont résumées sur la page Wikipedia, https://en.wikipedia.org/wiki/Genera...mming)#C.2B.2B ).
La première solution consiste à utiliser une directive macro pour utiliser le mot clé yield. Les exemples wiki sont assez parlant, une implémentation est disponible ici. Cette solution me paraît raisonnablement simple et ne perturbe pas trop le code que je calque. Reproches qui semblent généralement fait : ça ne fait pas trop "C++", et les macros on m'a dit qu'il fallait faire très attention.
La deuxième solution consiste à utilise le C++11 et les itérables. Avantage apparent, ça semble être plus fidèle à la manière C++ de faire. Au moins sur une exemple simple (celui de wikipedia), ça me semble facile à implémenter.
Par contre, sachant que mon algorithme est un poil tordu quand même (appel de fonctions récursives, des yield en folie, voir ci-dessous), quelle approche me conseilleriez vous ?
Cordialement,
Un échantillon du code en Python (je suis toujours aussi choqué du typage inexistant, en fait ça rend les algos super dur à comprendre )
Code python : 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 def f(mu, nu, sigma, n, a): if mu == 2: yield visit(n, a) else: for v in f(mu - 1, nu - 1, (mu + sigma) % 2, n, a): yield v if nu == mu + 1: a[mu] = mu - 1 yield visit(n, a) while a[nu] > 0: a[nu] = a[nu] - 1 yield visit(n, a) elif nu > mu + 1: if (mu + sigma) % 2 == 1: a[nu - 1] = mu - 1 else: a[mu] = mu - 1 if (a[nu] + sigma) % 2 == 1: for v in b(mu, nu - 1, 0, n, a): yield v else: for v in f(mu, nu - 1, 0, n, a): yield v while a[nu] > 0: a[nu] = a[nu] - 1 if (a[nu] + sigma) % 2 == 1: for v in b(mu, nu - 1, 0, n, a): yield v else: for v in f(mu, nu - 1, 0, n, a): yield v
Partager