recursion confusion
Erik Max Francis
max at alcyone.com
Wed Apr 2 05:53:45 CEST 2003
Jon Schull wrote:
> Sometimes recursion befuddles me. This is one of those times.
>
> I want to convert a graph structure into a nested string
> For example I want this...
>
> g={0:[], 1:[11], 2:[21, 22], 22:[221,222]}
>
> ...to become this
> "0, 1[11], 2 [21, 22[221, 222]] "
>
> (with 221 and 222 nested under 22 which is also nested under 2)
>
> Of course, I want this to work for arbitrary nesting, and for strings
> as well as numbers.
Seems relatively straightforward. First, get a list of the graph nodes
that are top-level (i.e., those which are not the children of any node).
Then, write a recursive function which displays a node by its ID, and
its children, if it has any, in brackets afterward. Then take that list
of top-level nodes and run the function on each one, separating the
result with commas. Add spaces and/or formatting to taste.
The function would be something like this:
def render(node):
result = str(node)
children = getNodeChildren(node) # write this function
if children:
result += '[%s]' % ', '.join(map(render, children))
return result
>From looking at your routine, it looks like getNodeChildren would simply
be written as
def getNodeChildren(node):
return G.get(node, []) # calling your global dictionary G
Obviously, this might need improvement depending on your graph. If it
has cycle, then this will recurse indefinitely.
I leave it as an exercise for you to figure out how to find the
top-level nodes. (Hint: What property makes them top-level? How would
you test for that? If you use a recursive algorith, how would you
communicate that information down through the function calls?)
--
Erik Max Francis / max at alcyone.com / http://www.alcyone.com/max/
__ San Jose, CA, USA / 37 20 N 121 53 W / &tSftDotIotE
/ \ The people are to be taken in very small doses.
\__/ Ralph Waldo Emerson
Erik Max Francis' bookmarks / http://www.alcyone.com/max/links/
A highly categorized list of Web links.
More information about the Python-list
mailing list