Pythonで末尾再帰もどき
不快指数が高いのでむしゃくしゃしてやった。
とくに(スタックがあふれないという以上の)意味はありません
class TailRec(object): class TailRecException(Exception): def __init__(self,*args,**kwargs): self.args=args self.kwargs=kwargs def __init__(self,fnc,loopmax=100): self.fnc=fnc self.loopmax=loopmax def __call__(self,*args,**kwargs): for i in xrange(self.loopmax): try: ret=self.fnc(self,*args,**kwargs) except self.TailRecException,e: args=e.args[:] kwargs=e.kwargs return ret def reccall(self,*args,**kwargs): raise self.TailRecException(*args,**kwargs) if __name__=="__main__": #フィボナッチ数列 fib=TailRec((lambda self,n,x1,x2: self.reccall(n-1,x2,x1+x2) if (n>0) else x2 )) for i in xrange(1,10+1): print "fib",i,fib(i,0,1) print # 階乗 fac=TailRec((lambda self,n,y: self.reccall(n-1,y*n) if (n>0) else y )) for i in xrange(1,10+1): print "fac",i,fac(i,1)
以前書いたデコレータ版
http://boxheadroom.com/2009/06/15/py_rec_self
今回はクラスにしたので、1行で書けるしlambdaも使える
何か使いどころ無いかなーと思いつつ、一度も使ったことない