什么技术限制阻止计算python中的格雷厄姆数?

Hoo*_*ked 10 python math limits largenumber

假设运行该程序的计算机具有无限的内存,我对运行以下内容时Python将中断的位置感兴趣:

为了好玩,我在python中实现了hyperoperator作为模块hyperop.我的一个例子是格雷厄姆的数字:

def GrahamsNumber():
    # This may take awhile...
    g = 4
    for n in range(1,64+1):
        g = hyperop(g+2)(3,3)
    return g
Run Code Online (Sandbox Code Playgroud)

该类的精简版本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))
Run Code Online (Sandbox Code Playgroud)

本质上,库只是一个递归的右折操作,对n = 1基本情况有一个特殊的定义.最初__call__是高尔夫球:

return reduce(lambda x, y: self.lower(y, x), [a,]*b)
Run Code Online (Sandbox Code Playgroud)

但是,事实证明,你不能创建一个包含比C long更大的元素的列表.这是一个有趣的限制,大多数Python程序员可能在他们正常的日常工作中没有遇到它,并激发了以下问题.

如果有的话,hyperop由于python技术限制(特别是2.7.10),计算是否会失败?

per*_*sid 2

也许 hyperop 的原始版本很强大,但由于某些深奥的原因而失败,但这个确切的代码失败了,因为 hyperop 构造函数调用自身,并引发 RuntimeError 并显示“超出最大递归深度”(在递归调用的 sys.setrecursionlimit 之后 - 在 2.7 中为 1000)。默认情况下可能是 10)。