In einigen Fällen ist es möglicherweise vorzuziehen, einen Stapel anstelle einer Rekursion für Generatoren zu verwenden. Es sollte möglich sein, eine rekursive Methode mit einem Stapel und einer while-Schleife neu zu schreiben.
Hier ist ein Beispiel für eine rekursive Methode, die einen Rückruf verwendet und mithilfe der Stapellogik neu geschrieben werden kann:
def traverse_tree(callback):
root = get_root_node()
def recurse(node):
callback(node)
for child in node.get('children', []):
recurse(child)
recurse(root)
Die obige Methode durchläuft einen Knotenbaum, in dem jeder Knoten ein children
Array hat, das untergeordnete Knoten enthalten kann. Wenn jeder Knoten angetroffen wird, wird der Rückruf ausgegeben und der aktuelle Knoten an ihn übergeben.
Die Methode könnte auf diese Weise verwendet werden, indem einige Eigenschaften auf jedem Knoten ausgedruckt werden.
def callback(node):
print(node['id'])
traverse_tree(callback)
Verwenden Sie stattdessen einen Stapel und schreiben Sie die Traversal-Methode als Generator
def iternodes():
stack = [get_root_node()]
while stack:
node = stack.pop()
yield node
for child in reversed(node.get('children', [])):
stack.append(child)
(Beachten Sie, dass Sie die Reihenfolge der untergeordneten Elemente umkehren müssen, wenn Sie dieselbe Durchlaufreihenfolge wie ursprünglich wünschen, da das erste an den Stapel angehängte untergeordnete Element das letzte ist, das angezeigt wird.)
Jetzt können Sie das gleiche Verhalten wie traverse_tree
oben erzielen, jedoch mit einem Generator:
for node in iternodes():
print(node['id'])
Dies ist keine Einheitslösung, aber für einige Generatoren erhalten Sie möglicherweise ein gutes Ergebnis, wenn Sie die Rekursion durch die Stapelverarbeitung ersetzen.