Предполагая, что компьютер, на котором работает эта программа, имеет бесконечный объем памяти, меня интересует, где Python сломается при выполнении следующего:
Ради интереса я реализовал гипероператоры в python в виде модуля hyperop
. Один из моих примеров — число Грэма:
def GrahamsNumber():
# This may take awhile...
g = 4
for n in range(1,64+1):
g = hyperop(g+2)(3,3)
return g
Сокращенная версия класса hyperop
выглядит так:
def __init__(self, n):
self.n = n
self.lower = hyperop(n - 1)
def _repeat(self, a, b):
if self.n == 1:
yield a
i = 1
while True:
yield a
if i == b:
break
i += 1
def __call__(self, a, b):
return reduce(lambda x, y: self.lower(y, x), self._repeat(a, b))
По сути, библиотека представляет собой просто рекурсивную операцию сгиба вправо со специальным определением для базовый случай n=1. Первоначально __call__
красиво играл в гольф как:
return reduce(lambda x, y: self.lower(y, x), [a,]*b)
Однако оказывается, что вы можете не создавайте список с большим количеством элементов, чем размер C long. Это было забавное ограничение, с которым большинство программистов Python, вероятно, не сталкиваются в своей обычной повседневной жизни, и оно вызвало следующий вопрос.
Где, если вообще произойдет, расчет
hyperop
потерпит неудачу из-за технических ограничений Python (в частности, 2.7.10)?
yield
и бесконечных последовательностей или что-то, что можно сформулировать более кратко? - person user2864740   schedule 22.02.2016