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)) 

Вот такая получилась частица Erlang в Python )

ссылка на оригинал статьи http://habrahabr.ru/post/158385/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *