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

时间:2016-02-21 22:07:12

标签: python math limits largenumber

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

为了好玩,我在python中实现了hyperoperators作为模块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))

本质上,库只是一个递归的右折操作,具有base case of n=1的特殊定义。最初__call__以高雅的方式打高尔夫球:

return reduce(lambda x, y: self.lower(y, x), [a,]*b)

然而,it turns out that you can't make a list with more elements than the size of a C long。这是一个有趣的限制,大多数Python程序员可能不会在他们正常的日常生活中遇到这种限制,它激发了以下问题。

  

如果有的话,hyperop计算会因为技术限制python (特别是2.7.10)而失败吗?

1 个答案:

答案 0 :(得分:2)

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