rekurzivní rodokmen s objekty

hlasů
0

Ahoj kluci potřebuji pomoc při rekurzivní reprezentaci rodokmenu, je zde údaje:

children_and_parents = {
Mary: [Patricia, Lisa], 
Patricia: [Barbara, Helen, Maria], 
Maria: [Keren, Carol], 
Barbara: [Betty]
}

Musím se zmínit, že tyto hodnoty jsou objekty, takže musím jim children_and_parents zavolat [ „Maria“] dítě. - dostat [ ‚Patricia‘, ‚Lisa‘]

rekurzivní program, který jsem v současné době

def draw_family_tree(person, level=0):
if person in children_and_parents:
    for i in range (len(children_and_parents[person].child)):
        print ( *level, person)
        return draw_family_tree(children_and_parents[person].child[i], level+3) 

jaké to je v současné době dělá

Mary
   Patricia
      Barbara

ale výsledek by měl být něco jako

Mary
   Patricia
       Barbara
           Betty
       Helen
       Maria
           Keren
           Carol
   Lisa

tak jsem dostal uvízl úplně na žebrání programu, pokud by někdo byl ochoten pomoci bych opravdu ocení

rough kód https://repl.it/repls/BlondCavernousExponents

Položena 27/11/2018 v 17:53
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Nalezení kořen stromu je dobrým kandidátem pro samostatný provoz. Ve Vašem příkladu, víme, že to "Mary", abychom mohli odpovídajícím způsobem iteraci. Pokud nevíme (a je to bezpečné předpokládat, že první položka v dict je root), můžete napsat:

def find_root(tree):
    children = set([x for y in tree.values() for x in y])

    for k in tree.keys():
        if k not in children:
            return k

Pokud jde o skutečné řízení tiskového, zkuste tisknout na rodičovský uzel před iterace nad dětmi. Doporučuji také absolvování strom jako parametr do funkce pro udržení zapouzdření a udržovat ji k opakovanému použití (tj není závislá na nějakém proměnné nazvané children_and_parentsexistující ve volajícím rozsahu.

def draw_family_tree(tree, root, level=0, gap=3):
    if root:
        print(" " * level + root)

        if root in tree:
            for child in tree[root]:
                draw_family_tree(tree, child, level + gap)

Výstup:

Mary
   Patricia
      Barbara
         Betty
      Helen
      Maria
         Keren
         Carol
   Lisa

Zkus to!

Jak již bylo zmíněno v předchozí diskusi, nedoporučuji používat třídu pro jednoduchou <string, list>dvojici; to přidává spoustu výřečnosti bez funkce a je vlastně tak trochu zavádějící, protože parentmylně naznačuje, že člověk má rodič (je to vlastně s odkazem na jméno osoby, reprezentované objektem). Pokud se rozhodnete jít touto cestou, budete muset připojit .childke všem pole přístupů a napsat __repr__(self)funkci pro svou třídu (nebo print(root.parent).

Odpovězeno 27/11/2018 v 18:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more