fonction récursive

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous

J'ai une question de noob mais je n'ai jamais bien réussi à choper la logique des fonctions récursive et là, je ne pense pas avoir le choix de faire autrement
J'ai un dictionnaire composé de clés, valeurs. Il n'y a que 2 choses dans la liste:
- une liste (avec un booléen dedans)
- un dictionnaire qui ressemble à "son père"
Bref un bon exemple faut mieux que pleins de discours :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
d = {'ver': [[True], 'ou':[[False], {}],
     'la': [[True], 
                {'in': [[True], 
                            {'me':  [[True], 
                                {'1t': [[True], {}]}
                                    ]
                            }
                        ]
                }
            ]
    }

(désolé pour la présentation et les espaces)

Mon but est de récupérer toute les clés et le booléen qui est à côtés (premier élément de la liste)
si possible dans l'ordre mais ça c'est une autre histoire ^^

voici mon code :

1
2
3
4
5
6
7
8
def parseDict(d, options = ""):
    for key, values in d.items():         
        options += key + " : " + str(values[0][0]) + "\n" #values[0][0] correspond au booléen
        return options
        o = parseDict(values[1], options) #values[1] est dictionnaire "enfant"
        if o :
           return o
o = parseDict(d)

Édité par Angelo

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Si tu fais un return options, ligne 4, la fonction va se terminer et ne jamais évaluer la fin de la boucles ni les autres elements autre que le premier des elements du dictionnaire.

+1 -0
Staff

Cette réponse a aidé l'auteur du sujet

Bin si elle peut faire le return apres la boucle, non ? Quand elle a finit de traiter tous les éléments.

Je pourrais te donner la solution toute prete mais ça t'aiderai pas !

+1 -0

Une fonction récursive va en gros être définie avec au moins un cas de base, et un cas "standard". Un exemple vaut mieux qu'une explication foireuse :

1
2
3
4
5
6
# une fonction recursive qui somme les n premiers entiers
def sum(n):
    if n == 0: # Ça, c'est ton cas de base
        return 0
    else: # Sinon, voici la logique de ta fonction
        return n + sum(n-1)

Dans ce cas, on voit bien que la fonction va récursiver/boucler tant que n > 0 La, c'est à toi de trouver ton cas de base, dans ton cas, ce sera probablement un dictionnaire vide. Je ne vais pas t'aider a faire ton algo, parce que je n'ai pas bien compris la structure de ton dictionnaire x)

+0 -0

Si tu peux donner un exemple de dictionnaire plus clair parce que la, je ne comprend pas tout à la structure de ton truc. Un coup tu as des dictionnaires vides, puis des dictionnaires avec d'autres valeurs dedans.

Le problème de ta fonction actuelle c'est qu'elle va s'arrêter au premier return puisque ce mot clef va arrêter ta fonction. Là elle doit te renvoyer "ver : True" si je ne dis pas de bêtise, et il me semble que ce n'est pas ce que tu veux.

Si tu peux nous mettre ton dictionnaire complet, il faut trouver un pattern pour pouvoir déterminer le fameux cas de base comme dit GaaH plus haut.

Édité par Bestasttung

Coder allongé permet de faire du developper coucher

+0 -0

J'ai pas vraiment compris ce que tu cherches à faire, mais ça ressemble à du parcours d'arbre (chaque élément a un ou plusieurs fils).

Du coup pour essayer de comprendre fait les exos de bases de la récu : calculer la factorielle de n, les n premiers éléments de la suite de fibonacci mais aussi comprendre le système des arbres binaire :)

+0 -0
Auteur du sujet

bon j'ai fini par trouver :

1
2
3
4
5
6
7
8
9
def parseDict(d, level):
    level+=1
    options = ""
    for key, values in d.items():
        options += level * " " + "- " +  key + " : " + str(values[0][0]) + "\n"  
        options += parseDict(values[1], level)
    return options

o = parseDict(d, -1)

Merci à vous tous pour vous être penchez sur mon problème

Ah et désolé pour mon arbre . Effectivement j'ai ajouté le 'ou' à la main pour vous montrer qu'on peut avoir des dictionnaire sans enfant. J'ai surement oublié des accolade ou crochet/

Édité par Angelo

+0 -0
Auteur du sujet

Question pas idiote car je me suis fais la même réflexion :)

D'ailleurs je me demande même si le booléen est bien utile car, à priori, la clé est présente que si elle vaut True
Tu l'aura compris, ce n'est pas moi qui construit le dictionnaire. Ce sont des valeurs que l'on récupère d'un dump qui sert à voir des différences entres révisions d'objets
On pourrait simplifier certainement le "comit" pour ne plus avoir le booléen mais c'est encore trop confus pour moi pour que j'y mette les pieds

Édité par Angelo

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte