Подтвердить что ты не робот

Какие технические ограничения препятствуют вычислению числа Грэма в python?

Предполагая, что компьютер, на котором запущена эта программа, имеет бесконечное количество памяти, меня интересует, где 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 длиной. Это было забавное ограничение, которое большинство программистов на Python, вероятно, не встречали в повседневной жизни, и это вызвало следующий вопрос.

Где, если вообще произойдет, вычисление hyperop завершится неудачей из-за технического ограничения python (в частности 2.7.10)?

4b9b3361

Ответ 1

Возможно, оригинальная версия hyperop является надежной и терпит неудачу из-за какой-то эзотерической причины, но этот точный код терпит неудачу, потому что конструктор hyperop вызывает себя, и он вызывает RuntimeError с "максимальной глубиной рекурсии" (после sys.setrecursionlimit рекурсивных вызовов - что составляет 1000 в 2.7.10 по умолчанию).