python中尾递归用法实例详解
本文实例讲述了python中尾递归用法。分享给大家供大家参考。具体分析如下:
如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。
原理:
当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活跃记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。因此,只要有可能我们就需要将递归函数写成尾递归的形式.
代码:
#Thisprogramshowsoffapythondecorator( #whichimplementstailcalloptimization.It #doesthisbythrowinganexceptionifitis #it'sowngrandparent,andcatchingsuch #exceptionstorecallthestack. importsys classTailRecurseException: def__init__(self,args,kwargs): self.args=args self.kwargs=kwargs deftail_call_optimized(g): """ Thisfunctiondecoratesafunctionwithtailcall optimization.Itdoesthisbythrowinganexception ifitisit'sowngrandparent,andcatchingsuch exceptionstofakethetailcalloptimization. Thisfunctionfailsifthedecorated functionrecursesinanon-tailcontext. """ deffunc(*args,**kwargs): f=sys._getframe() iff.f_backandf.f_back.f_backandf.f_back.f_back.f_code==f.f_code: raiseTailRecurseException(args,kwargs) else: while1: try: returng(*args,**kwargs) exceptTailRecurseException,e: args=e.args kwargs=e.kwargs func.__doc__=g.__doc__ returnfunc @tail_call_optimized deffactorial(n,acc=1): "calculateafactorial" ifn==0: returnacc returnfactorial(n-1,n*acc) printfactorial(10000) #printsabig,bignumber, #butdoesn'thittherecursionlimit. @tail_call_optimized deffib(i,current=0,next=1): ifi==0: returncurrent else: returnfib(i-1,next,current+next) printfib(10000) #alsoprintsabignumber, #butdoesn'thittherecursionlimit.
希望本文所述对大家的Python程序设计有所帮助。