Consider a simple function that adds the first N integers.
(e.g. sum(5) = 1 + 2 + 3 + 4 + 5 = 15
).
Here is a simple Python implementation that uses recursion:
def recsum(x):
if x == 1:
return x
else:
return x + recsum(x - 1)
If you called recsum(5)
, this is what the Python
interpreter would evaluate.
recsum(5)
5 + recsum(4)
5 + (4 + recsum(3))
5 + (4 + (3 + recsum(2)))
5 + (4 + (3 + (2 + recsum(1))))
5 + (4 + (3 + (2 + 1)))
15
Note how every recursive call has to complete before the Python interpreter
begins to actually do the work of calculating the sum.
Here‘s a tail-recursive version of the same function:
def tailrecsum(x, running_total=0):
if x == 0:
return running_total
else:
return tailrecsum(x - 1, running_total + x)
Here‘s the sequence of events that would occur if you
called tailrecsum(5)
, (which would effectively
be tailrecsum(5, 0)
, because of the default second
argument).
tailrecsum(5, 0)
tailrecsum(4, 5)
tailrecsum(3, 9)
tailrecsum(2, 12)
tailrecsum(1, 14)
tailrecsum(0, 15)
15
In the tail-recursive case, with each evaluation of the recursive call,
the running_total
is updated.
时间: 2024-08-08 09:41:00