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 相关文章推荐
在Django中创建动态视图的教程
Jul 15 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
itchat接口使用示例
Oct 23 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
kali中python版本的切换方法
Jul 11 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
python3 中使用urllib问题以及urllib详解
Aug 03 Python
Python的信号库Blinker用法详解
Dec 31 Python
Windows安装Anaconda3的方法及使用过程详解
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
Laravel 5 框架入门(三)
2015/04/09 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
javascript+mapbar实现地图定位
2010/04/09 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
详解vue后台系统登录态管理
2019/04/02 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
Python变量作用范围实例分析
2015/07/07 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
python将unicode转为str的方法
2017/06/21 Python
numpy数组拼接简单示例
2017/12/15 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
外贸学院会计专业应届生求职信
2013/11/14 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
促销活动总结范文
2014/04/30 职场文书
驾驶员培训方案
2014/05/01 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
教师读书活动心得体会
2016/01/14 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
dubbo服务整合zipkin详解
2021/07/26 Java/Android