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 24 Python
python实现sublime3的less编译插件示例
Apr 27 Python
全面理解Python中self的用法
Jun 04 Python
Python内存读写操作示例
Jul 18 Python
python 列表推导式使用详解
Aug 29 Python
Win10里python3创建虚拟环境的步骤
Jan 31 Python
Python netmiko模块的使用
Feb 14 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
利用Python发送邮件或发带附件的邮件
Nov 12 Python
Python实现智慧校园自动评教全新版
Jun 18 Python
Python内置数据类型中的集合详解
Mar 18 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
浅谈numpy库的常用基本操作方法
2018/01/09 Python
彻底搞懂Python字符编码
2018/01/23 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
python 文件转成16进制数组的实例
2018/07/09 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
恶意软件的定义
2014/11/12 面试题
《祁黄羊》教学反思
2014/04/22 职场文书
企业理念标语
2014/06/09 职场文书
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers