python中尾递归用法实例详解
本文实例讲述了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程序设计有所帮助。
数据分析咨询请扫描二维码
# 现在什么行业发展前景最好 **人工智能与机器学习** - 人工智能技术快速发展,广泛应用于智能家居、自动驾驶等领域。 - 具备巨 ...
2024-11-27# 未来最有前景的行业 **人工智能与机器学习** - 人工智能被认为是未来最具潜力的行业之一,其应用范围广泛,包括智能家居、医 ...
2024-11-27数据分析领域蓬勃发展,成为当今行业中备受追捧的职业之一。作为一个初入此领域的学习者,您可能会困惑于应该学习哪些课程才能打 ...
2024-11-27统计与大数据分析专业的就业前景非常广阔,随着数字化时代的到来,这一领域的专业人才需求量不断增加。以下是关于该专业就业前景 ...
2024-11-27数字经济作为全球经济的重要组成部分,正在迅速发展并深刻改变着经济结构和竞争格局。根据多项证据,数字经济的发展现状和趋势可 ...
2024-11-27数据运营是指通过收集、分析和利用大量数据,为企业决策和业务发展提供支持的工作。其核心任务包括数据的采集、整理、分析、挖掘 ...
2024-11-27数据建模是一种重要的技术,用于有效组织和记录系统数据,旨在满足特定业务需求并确保数据的准确性和一致性。这一过程通过抽象化 ...
2024-11-27《Python数据分析极简入门》 第2节 8-2 Pandas 数据重塑 - 数据堆叠 数据堆叠 df=pd.DataFrame({'专业':np.re ...
2024-11-27数据收集与整理 - 从各种来源收集数据,清洗和整理以确保数据质量和可用性。 数据分析与建模 - 运用统计学方法和机器学习模型对 ...
2024-11-26技术技能 - 编程能力: 数据分析师需要掌握至少一门编程语言,如Python、R或SQL。这些语言对于数据处理、建模和分析至关重要。例 ...
2024-11-26数据分析领域涵盖多样性岗位,根据工作职责和技能需求划分。这些角色在企业中扮演关键角色,帮助组织制定战略、优化流程并实现商 ...
2024-11-26数据分析是一种通过收集、处理、解释和展示数据,以获得见解和决策支持的过程。这个领域涉及使用统计学、计算机科学和商业智能等 ...
2024-11-26数据分析领域正日益成为当今商业世界中不可或缺的一环。随着数据量的爆炸式增长,企业越来越需要能够从这些海量信息中提炼出宝贵 ...
2024-11-26数据分析师需要学习的课程内容非常广泛,涵盖了从基础理论到实际应用的多个方面。在追求这一职业道路上,合适的教育和培训至关重 ...
2024-11-26数据分析师作为当今信息时代中关键的职业之一,扮演着解释、预测和推动决策的重要角色。他们需要多方位技能来处理各种复杂的数据 ...
2024-11-26数据分析师在今天的商业环境中扮演着至关重要的角色。他们需要应对各种复杂的数据分析任务和业务需求,这要求他们具备广泛的技能 ...
2024-11-26在当今快速变化的技术和市场环境中,数字化转型是企业利用数字技术全面重新设计和改造业务的重要过程。这一转型旨在通过整合云计 ...
2024-11-26数字化转型: 是企业在现代技术和市场环境不断变化的背景下,利用数字技术对其业务进行全面的重新设计和改造的过程。其核心目标是 ...
2024-11-26理论基础与高级学习 数学专业理论基础: 学生首先需要掌握数学的基础理论,包括数学分析、高等代数、几何学、常微分方程、实变函 ...
2024-11-26数字化转型:现代企业蜕变的引擎 数字化转型已然成为当今企业持续发展的关键支柱。这一过程并非简单的技术升级,更是涉及企业文 ...
2024-11-26