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同时给两个收件人发送邮件的方法
Apr 30 Python
Python捕捉和模拟鼠标事件的方法
Jun 03 Python
Python实现的下载网页源码功能示例
Jun 13 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
解决python flask中config配置管理的问题
Jul 26 Python
python将dict中的unicode打印成中文实例
May 11 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 Python
python wsgiref源码解析
Feb 06 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 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
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
python实现简单的计时器功能函数
2015/03/14 Python
python删除某个字符
2018/03/19 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
Python连接字符串过程详解
2020/01/06 Python
Python ini文件常用操作方法解析
2020/04/26 Python
python能否java成为主流语言吗
2020/06/22 Python
python多线程和多进程关系详解
2020/12/14 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
南京市纪委监察局整改方案
2014/09/16 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
停车场管理协议书范本
2014/10/08 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
JavaScript 定时器详情
2021/11/11 Javascript