fonction récursive

Le problème exposé dans ce sujet a été résolu.

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)
+0 -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)

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.

+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 :)

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/

+0 -0

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

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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