python 中哪些技术限制阻止了格雷厄姆数的计算?
What technical limitations prevent the calculation of Graham's number in python?
假设计算机 运行 这个程序有无限量的内存,我感兴趣的是 Python 在 运行 以下时会在哪里中断:
为了好玩,我实现了 hyperoperators in python as the module hyperop
。我的例子之一是格雷厄姆的号码:
def GrahamsNumber():
# This may take awhile...
g = 4
for n in range(1,64+1):
g = hyperop(g+2)(3,3)
return g
class 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 程序员在日常工作中可能不会遇到的一个有趣的限制,它激发了以下问题。
Where, if at all, will the hyperop
calculation fail due to a technical limitation of python (specifically 2.7.10)?
也许 hyperop 的原始版本很健壮并且由于某些深奥的原因而失败,但是这段代码失败是因为 hyperop 构造函数调用自身并引发 RuntimeError "maximum recursion depth exceeded"(在 sys.setrecursionlimit 递归调用之后 -在 2.7.10 中默认为 1000。
假设计算机 运行 这个程序有无限量的内存,我感兴趣的是 Python 在 运行 以下时会在哪里中断:
为了好玩,我实现了 hyperoperators in python as the module hyperop
。我的例子之一是格雷厄姆的号码:
def GrahamsNumber():
# This may take awhile...
g = 4
for n in range(1,64+1):
g = hyperop(g+2)(3,3)
return g
class 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 程序员在日常工作中可能不会遇到的一个有趣的限制,它激发了以下问题。
Where, if at all, will the
hyperop
calculation fail due to a technical limitation of python (specifically 2.7.10)?
也许 hyperop 的原始版本很健壮并且由于某些深奥的原因而失败,但是这段代码失败是因为 hyperop 构造函数调用自身并引发 RuntimeError "maximum recursion depth exceeded"(在 sys.setrecursionlimit 递归调用之后 -在 2.7.10 中默认为 1000。