Python-末尾再帰の最適化

Pythonが末尾再帰を最適化しないことは秘密ではありません。 さらに、グイド自身もこれに反対しています。 しかし、誰かがそれを必要とするなら、小さなエレガントな解決策があります。 カットの下で......



シンプルなソリューション



class recursion(object): "Can call other methods inside..." def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): result = self.func(*args, **kwargs) while callable(result): result = result() return result def call(self, *args, **kwargs): return lambda: self.func(*args, **kwargs) @recursion def sum_natural(x, result=0): if x == 0: return result else: return sum_natural.call(x - 1, result + x) #       # RuntimeError: maximum recursion depth exceeded print(sum_natural(1000000))
      
      





ところで、任意の順序で相互に関数を呼び出すことができます。 コードはこのケースを完全に満たします。

 @recursion def sum_natural_x(x, result=0): if x == 0: return result else: return sum_natural_y.call(x - 1, result + x) @recursion def sum_natural_y(y, result=0): if y == 0: return result else: return sum_natural_x.call(y - 1, result + y) print(sum_natural_x(1000000))
      
      





PythonのErlangを少し紹介します)



All Articles