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 Tkinter简单布局实例教程
Sep 03 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
详解Python的Django框架中manage命令的使用与扩展
Apr 11 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
python3中bytes和string之间的互相转换
Feb 09 Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
解决Django layui {{}}冲突的问题
Aug 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
php 空格,换行,跳格使用说明
2009/12/18 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
js脚本实现数据去重
2014/11/27 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
js实现小时钟效果
2020/03/25 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
创业计划书如何吸引他人眼球
2014/01/10 职场文书
财务会计自荐信范文
2014/02/21 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
教师一岗双责责任书
2014/04/16 职场文书
竞赛口号大全
2014/06/16 职场文书
党校个人总结
2015/03/04 职场文书
Python 中 Shutil 模块详情
2021/11/11 Python
python创建字典及相关管理操作
2022/04/13 Python