这里我们用典型的斐波那契数列作为例子,来展示python中使用装饰器来优化尾递归的示例,需要的朋友可以参考下
尾递归简介尾递归是函数返回最后一个操作是递归调用,则该函数是尾递归。递归是线性的比如factorial函数每一次调用都会创建一个新的栈(last-in-first-out)通过不断的压栈,来创建递归, 很容易导致栈的溢出。而尾递归则使用当前栈通过数据覆盖来优化递归函数。阶乘函数factorial, 通过把计算值传递的方法完成了尾递归。但是python不支出编译器优化尾递归所以当递归多次的话还是会报错(学习用)。
eg:
def factorial(n, x):
if n == 0:
return x
else:
return factorial(n-1, n*x)
print factorial(5, 1) # 120
尾递归优化这里用到了斐波那契数来作为例子.线性递归的算法由于太过一低效就被我们pass掉了,我们先来看尾递过方式的调用:
(n,b1=1,b2=1,c=3):
if n>> def fib(n,b1=1,b2=1,c=3):
… if n>> fib(1001)
70330367711422815821835254877183549770181269836358732742604905087154537118196933579742249494562611733487750449241765991088186363265450223647106012053374121273867339111198139373125598767690091902245245323403501l
>>>
如果我们用fib(1002),结果,茶几了,如下:
…..
file “”, line 8, in fib
file “”, line 8, in fib
file “”, line 8, in fib
file “”, line 8, in fib
file “”, line 8, in fib
file “”, line 8, in fib
runtimeerror: maximum recursion depth exceeded
>>>
好了,现在我们来尾递归优化
我们给刚才的fib函数增加一个decorator,如下:
@tail_call_optimized
def fib(n,b1=1,b2=1,c=3):
if n