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 28 Python
python中迭代器(iterator)用法实例分析
Apr 29 Python
python中abs&map&reduce简介
Feb 20 Python
python最长回文串算法
Jun 04 Python
python并发和异步编程实例
Nov 15 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
Python列表(List)知识点总结
Feb 18 Python
python redis连接 有序集合去重的代码
Aug 04 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
Python基于time模块表示时间常用方法
Jun 18 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 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+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
javascript 节点遍历函数
2010/03/28 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
python实现文件的分割与合并
2019/08/29 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
《美丽的黄昏》教学反思
2014/02/28 职场文书
办理房产过户的委托书
2014/09/14 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
优秀教师申报材料
2014/12/16 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
亲情作文之母爱
2019/09/25 职场文书
nginx设置资源请求目录的方式详解
2022/05/30 Servers
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技