Kann mir jemand helfen, die Logik des unten gezeigten Programms durchzugehen? Ich habe versucht, die Python debugger zu verwenden. Das hat mir aber nicht viel geholfen.Ich kann nicht durch die Logik gehen! Kann mir jemand in die richtige Richtung zeigen?
Ich verstehe nicht, wie folgt vor:
preorder_traversal()
Zum Beispiel an der
yield (parent, root)
Codezeile; Gibt die Funktion diese Werte als Generator an diesem Punkt an den Aufrufer zurück oder gibt sie den Generator zurück und geht dann weiter in die Funktionpreorder_traversal()
?Auch schmilzt völlig, wenn Sie versuchen, meinen Kopf um den rekursiven Anruf zu
preorder_traversal()
zu wickeln. Kennt jemand einen Weg, dies zu verstehen? Wie eine Wahrheitstabelle oder etwas Ähnliches, mit dem ich das Programm manuell mit Stift und Papier oder Notizblock oder was auch immer durchgehen kann. Ich denke, der komplizierteste Teil davon ist die Verschachtelung und die Rekursion.
Ich verstehe nicht, den Knoten in einem Knoten in einem Knoten, etc. Oder die gesamte Zugabe und Randteil, der einen Knoten zu einer Liste hinzufügt.
-Code
class Node(object):
"""A simple digraph where each node knows about the other nodes
it leads to.
"""
def __init__(self, name):
self.name = name
self.connections = []
return
def add_edge(self, node):
"Create an edge between this node and the other."
self.connections.append(node)
return
def __iter__(self):
return iter(self.connections)
def preorder_traversal(root, seen=None, parent=None):
"""Generator function to yield the edges via a preorder traversal."""
if seen is None:
seen = set()
yield (parent, root)
if root in seen:
return
seen.add(root)
for node in root:
for (parent, subnode) in preorder_traversal(node, seen, root):
yield (parent, subnode)
return
def show_edges(root):
"Print all of the edges in the graph."
for parent, child in preorder_traversal(root):
if not parent:
continue
print '%5s -> %2s (%s)' % (parent.name, child.name, id(child))
# Set up the nodes.
root = Node('root')
a = Node('a')
b = Node('b')
c = Node('c')
# Add edges between them.
root.add_edge(a)
root.add_edge(b)
a.add_edge(b)
b.add_edge(a)
b.add_edge(c)
a.add_edge(a)
print 'ORIGINAL GRAPH:'
show_edges(root)
Dankes- dies zu lesen.
Mögliche Duplikat (https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do) – ephemient
Was ist mit dem rekursiven Algorithmus Verwirrung Teil? – user3870315
Mögliches Duplikat von [Probleme beim Verständnis der rekursiven Funktionen von Baumdurchquerungen] (https://stackoverflow.com/questions/33818795/having-trouble-understanding-tree-traversal-recursive-functions) – ephemient