python中尾递归用法实例详解


Posted in Python onApril 28, 2015

本文实例讲述了python中尾递归用法。分享给大家供大家参考。具体分析如下:

如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。

原理:

当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活跃记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。因此,只要有可能我们就需要将递归函数写成尾递归的形式.

代码:

# This program shows off a python decorator(
# which implements tail call optimization. It
# does this by throwing an exception if it is
# it's own grandparent, and catching such
# exceptions to recall the stack.
import sys
class TailRecurseException:
 def __init__(self, args, kwargs):
  self.args = args
  self.kwargs = kwargs
def tail_call_optimized(g):
 """
 This function decorates a function with tail call
 optimization. It does this by throwing an exception
 if it is it's own grandparent, and catching such
 exceptions to fake the tail call optimization.
 This function fails if the decorated
 function recurses in a non-tail context.
 """
 def func(*args, **kwargs):
  f = sys._getframe()
  if f.f_back and f.f_back.f_back and f.f_back.f_back.f_code == f.f_code:
   raise TailRecurseException(args, kwargs)
  else:
   while 1:
    try:
     return g(*args, **kwargs)
    except TailRecurseException, e:
     args = e.args
     kwargs = e.kwargs
 func.__doc__ = g.__doc__
 return func
@tail_call_optimized
def factorial(n, acc=1):
 "calculate a factorial"
 if n == 0:
  return acc
 return factorial(n-1, n*acc)
print factorial(10000)
# prints a big, big number,
# but doesn't hit the recursion limit.
@tail_call_optimized
def fib(i, current = 0, next = 1):
 if i == 0:
  return current
 else:
  return fib(i - 1, next, current + next)
print fib(10000)
# also prints a big number,
# but doesn't hit the recursion limit.

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
简单使用Python自动生成文章
Dec 25 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
pymysql的简单封装代码实例
Jan 08 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 Python
Python数据类型最全知识总结
May 31 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 Python
Python序列化模块JSON与Pickle
Jun 05 Python
在Python中使用元类的教程
Apr 28 #Python
python删除列表中重复记录的方法
Apr 28 #Python
python3实现短网址和数字相互转换的方法
Apr 28 #Python
python实现从网络下载文件并获得文件大小及类型的方法
Apr 28 #Python
浅析Python中的多重继承
Apr 28 #Python
python输出当前目录下index.html文件路径的方法
Apr 28 #Python
Python实现基于权重的随机数2种方法
Apr 28 #Python
You might like
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
php使用curl简单抓取远程url的方法
2015/03/13 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
js查错流程归纳
2012/05/04 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
jQuery实现日历效果
2020/09/11 jQuery
js实现纯前端压缩图片
2020/11/16 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python字符串替换实例分析
2015/05/11 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python for循环中的陷阱详解
2018/07/13 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
python绘制规则网络图形实例
2019/12/09 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
2014年项目工作总结
2014/11/24 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书