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使用os模块和fileinput模块来操作文件目录
Jan 19 Python
python 换位密码算法的实例详解
Jul 19 Python
利用python解决mysql视图导入导出依赖的问题
Dec 17 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
Jan 11 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
python装饰器代替set get方法实例
Dec 19 Python
Python动态声明变量赋值代码实例
Dec 30 Python
Python多线程多进程实例对比解析
Mar 12 Python
Python新手学习标准库模块命名
May 29 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
Python实现随机爬山算法
Jan 29 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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
php session和cookie使用说明
2010/04/07 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
php中的ini配置原理详解
2014/10/14 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
北大研究生linux应用求职信
2013/10/29 职场文书
数据员岗位职责
2013/11/19 职场文书
运动会广播稿200米
2014/01/27 职场文书
上课看小说检讨书
2014/02/22 职场文书
内乡县衙导游词
2015/02/05 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
运动会通讯稿300字
2015/07/20 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
MySQL池化框架学习接池自定义
2022/07/23 MySQL