Return ne "retourne" pas et continue... !?

Résolu
jpmaton Messages postés 67 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 26 septembre 2023 - 26 sept. 2023 à 09:52
jpmaton Messages postés 67 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 26 septembre 2023 - 26 sept. 2023 à 17:54

Bonjour,

Je rame avec ce code, en effet dans ma fonction récursive, 'return' ne retourne pas la valeur 'a' et continue à procéder à la récursivité jusqu'à bien sûr planter.

Voici mon code :

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
            fctCodes(a, 0)
    a = a[:-1]
    L.insert(Ld[-1], Lq[-1])
    d = Ld[-1]
    Lq.pop(-1)
    Ld.pop(-1)
    #print("post", L, Lq, a, Ld)
    fctCodes(a, d + 1)


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

Je me demande où est l'erreur de codage.

Grand merci pour l'aide.

Jean-Paul


2 réponses

jee pee Messages postés 39681 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 2 mai 2024 2
Modifié le 26 sept. 2023 à 13:45

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.


1
jpmaton Messages postés 67 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 26 septembre 2023 3
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  1 02 2 1 1 2 20   ->  0010211220

JPM

0
jpmaton Messages postés 67 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 26 septembre 2023 3
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

0
Whismeril Messages postés 19036 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 mai 2024 656
26 sept. 2023 à 10:26

Bonjour 

j'ai testé ni cherché à comprendre, mais est ce ton message s'affiche?


0
jpmaton Messages postés 67 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 26 septembre 2023 3
26 sept. 2023 à 17:30

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

0
Rejoignez-nous