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 17 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
python生成器用法实例详解
Nov 22 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
Jan 22 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
python实现小程序推送页面收录脚本
Apr 20 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 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
第八节--访问方式
2006/11/16 PHP
header跳转和include包含问题详解
2012/09/08 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
vc6编写python扩展的方法分享
2014/01/17 Python
ptyhon实现sitemap生成示例
2014/03/30 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
python中os.remove()用法及注意事项
2021/01/31 Python
《灰椋鸟》教学反思
2014/04/27 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
北京导游词
2015/02/12 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers