[pypy-commit] pypy default: un-recursivify depth_first_search()
arigo
pypy.commits at gmail.com
Thu Nov 17 10:20:22 EST 2016
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r88444:c49289d2da96
Date: 2016-11-17 16:12 +0100
http://bitbucket.org/pypy/pypy/changeset/c49289d2da96/
Log: un-recursivify depth_first_search()
diff --git a/rpython/tool/algo/graphlib.py b/rpython/tool/algo/graphlib.py
--- a/rpython/tool/algo/graphlib.py
+++ b/rpython/tool/algo/graphlib.py
@@ -25,18 +25,27 @@
return edges
def depth_first_search(root, vertices, edges):
- seen = {}
+ seen = set([root])
result = []
- def visit(vertex):
- result.append(('start', vertex))
- seen[vertex] = True
- for edge in edges[vertex]:
- w = edge.target
- if w in vertices and w not in seen:
- visit(w)
- result.append(('stop', vertex))
- visit(root)
- return result
+ stack = []
+ while True:
+ result.append(('start', root))
+ stack.append((root, iter(edges[root])))
+ while True:
+ vertex, iterator = stack[-1]
+ try:
+ edge = next(iterator)
+ except StopIteration:
+ stack.pop()
+ result.append(('stop', vertex))
+ if not stack:
+ return result
+ else:
+ w = edge.target
+ if w in vertices and w not in seen:
+ seen.add(w)
+ root = w
+ break
def vertices_reachable_from(root, vertices, edges):
for event, v in depth_first_search(root, vertices, edges):
More information about the pypy-commit
mailing list