[Python-Dev] Proper tail recursion
Andrew Koenig
ark-mlist at att.net
Thu Jul 15 16:53:37 CEST 2004
> > How about: Tail recursion "enables" recursion-oriented (functional)
> > style? :)
>
> Still -1. I was understating my case: I find the "recursion is the
> basis of everything" attitude harmful.
I don't believe that recursion is the basis of everything. Nevertheless, I
do think that there are some algorithms that are much more easily expressed
in recursive than in iterative terms, and I wish that Python did not impose
a fixed limit on recursion depth. For example:
def traverse(t, f):
if t:
f(t)
traverse(t.left)
traverse(t.right)
This code has the unfortunate limitation of being unable to traverse a tree
deeper than the recursion limit. I can use tail-recursion elimination to
remove this restriction for one branch of each node:
def traverse(t, f):
while t:
f(t)
traverse(t.left)
t = t.right
which makes the code much more useful if the "trees" are really lists
according to Lisp conventions (i.e. the left branch of each node is usually
short), but I would really rather that the compiler did this transformation
for me, as I find the first version much easier to understand than the
second.
If I really want to work around the recursion limit altogether, I have to
define a stack of my own:
def traverse(t, f):
s = [t]
while s:
t = s.pop()
if t:
f(t)
s.append(t.right)
s.append(t.left)
Now I am free of the recursion-depth limitation, but the code has become
complicated enough to reduce my confidence in its correctness.
So I agree that recursion is not the basis of everything--but it is the
basis of some things, and I would like to be able to express those things
recursively without having to worry about the implementation stopping me. I
understand that the existence of Jython may make this wish impossible to
achieve in practice, but it's still there.
More information about the Python-Dev
mailing list