Teaching : Python, Scheme, Java...

Bjorn Pettersen BPettersen at NAREX.com
Fri Apr 18 10:52:31 EDT 2003


> From: Alex Martelli [mailto:aleax at aleax.it] 
> 
> Donnal Walter wrote:
> 
> > 
> > What is the difference between "recursive calls" and "tail 
> > recursion"? Sometimes I have written methods that call the 
> > same method on a parent or child object, with the depth of 
> > recursion being limited by a method of the same name NOT 
> > calling itself. In the past I have thought of this
> > as tail recursion. Is this incorrect?
> 
> A function-call is "tail" if it's the last thing the caller does,
> i.e., basically, if the caller executes "return somefunction(args)"
> or a semantically equivalent sequence.
> 
[..recursive..]
> 
> A function-call is "tail recursive" if it's tail and recursive.
> Such calls can be optimized by avoiding the allocation of a new
> stack frame -- the same frame object that's already on the
> stack to handle this specific call can be re-used (if you're
> willing to lose traceback information -- Python currently does
> not allow that).

[To digress, elaborate, use my MS for something :-)] It's acutally more
general. Any tail calls (recursive or not) can be optimized, trivially
(assuming the return address is stored in sp, etc.), instead of:

   return f()

being compiled to (A) -- excuse my shorthand:

         push sp, loc1
         jump f
   loc1: pop sp
         reg1 = pop fn_result_stack # 1
         push reg1, fn_result_stack # 2
         jump sp

(1 and 2 would disappear with a peephole optimizer, assuming there is
one) tail call optimization creates (B):

         jump f

with the last two lines of f looking like the last two lines of (A) the
semantics are the same.

[[Now what if you came up with an algorithm that converted any function
to a function with tail call? Your code for return would be really fast,
it would never "return" to a previous state, you wouldn't need a stack
anymore, implementing continuations would be trivial... They did it for
SML, and the various steps, algorithms, etc. are nicely described in:

   Compiling with Continuations, Andrew Appel
   Cambridge University Press 1992, ISBN 0-521-41695-7

which is one of the more interesting books I read in college both for
language and compiler theory (couldn't find an online-ref).]]

-- bjorn





More information about the Python-list mailing list