Bonjour,
Tu as une fonction récursive, qui s'auto relance. Quand tu trouves la chaine souhaitée, tu es au niveau 9 d'appels. Le return a sort du niveau 9, mais pas de la fonction elle même, tu reviens au niveau 8 pour poursuivre le code à la ligne suivante ayant appelé le niveau 9, le niveau 8 se déroule, ignorant que c'est fini et on boucle, tombe en échec ... Il te faut mettre en place un mécanisme pour dépiler les niveaux détectant que c'est fini. Et quand on veut récupérer la valeur donnée sur un return, il faut affecter la valeur retournée par la fonction à une variable. Car là il faut remonter le résultat donné au niveau 9 jusqu'à l'appel initial de la fonction. Voilà un exemple où on utilise la valeur retournée pour sortir des niveaux précédents.
from itertools import product def fctCodes(a, d): for i in range(d, len(L)): if L[i][0] == a[-1]: a += L[i][1] Lq.append(L[i]) Ld.append(i) L.remove(L[i]) #print("post", L, Lq, a, Ld) if len(a) >= 10: print("On devrait retourner dans le progr. appelant :", a) return a retCode=fctCodes(a, 0) if retCode != "": print("fin 1") return retCode a = a[:-1] L.insert(Ld[-1], Lq[-1]) d = Ld[-1] Lq.pop(-1) Ld.pop(-1) #print("post", L, Lq, a, Ld) retCode=fctCodes(a, d + 1) if retCode != "": print("fin 2") return retCode L0 = list(product(['0', '1', '2'], repeat=2)) L = list(a + b for a, b in L0) Lq = [] Ld = [] a = L[0] L.pop(0) #print(L) z = fctCodes(a, 0) print(z) ## 'a' attendu est 0010211220
Quand tu donnes un exemple de code, il serait bon d'en donner les règles, l'énoncé. Car je n'ai pas compris, ni vraiment cherché à faire de la rétro analyse du code pour savoir comment on passe de ['00', '01', '02', '10', '11', '12', '20', '21', '22'] à 0010211220. Je suis persuadé que tu utilises trop de variables et trop de lignes de code.
Bonjour
j'ai testé ni cherché à comprendre, mais est ce ton message s'affiche?
Hello Whismeril,
le print de la ligne 12 (avant le return) donne le résultat.
Pas celui de la ligne 33 qui suit la ligne 32 appelante alors que c'est celui que j'attends suite à un return.
JPM
26 sept. 2023 à 17:42
Hello Jee Pee,
le but est d'adapter l'ordre de la liste de 9 items ['00', '01', '02', '10', '11', '12', '20', '21', '22'] en un string de longueur 9+1 : '0010211220' où items de la liste se retrouvent à la queue leu-leu dans ce string de 10 positions. Les termes sont chainés de sorte que le 2e terme (italique) de chaque item soit le premier terme (gras) du suivant.
00 01 10 02 21 11 12 22 20 -> 0010211220
JPM
26 sept. 2023 à 17:54
Re-hello Jee Pee,
je viens de tester ta correction qui est tout-à-fait efficace.
Grand merci pour tes enseignements concernant cette fonction récursive.
Bien à toi
JPM