Python中使用装饰器来优化尾递归的示例

本文介绍了Python中的尾递归优化,通过一个斐波那契数列的例子展示如何使用装饰器实现。虽然Python不直接支持尾递归优化,但通过自定义装饰器可以避免栈溢出,使得大规模递归调用仍能高效运行。同时,文章讨论了这种方法相对于直接尾递归的效率损失,并鼓励读者深入学习计算机基础知识,提升自我。
摘要由CSDN通过智能技术生成

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府
尾递归简介
尾递归是函数返回最后一个操作是递归调用,则该函数是尾递归。
递归是线性的比如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<3:
  return 1
 else:
  if n==c:
   return b1+b2
  else:
   return Fib(n,b1=b2,b2=b1+b2,c=c+1)

这段程序我们来测试一下,调用 Fib(1001)结果:

>>> def Fib(n,b1=1,b2=1,c=3):
 
...  if n<3:
 
...   return 1
 
...  else:
 
...   if n==c:
 
...    return b1+b2
 
...   else:
 
...    return F
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值