我编写了代码来计算 Ackermann 函数并存储结果,但在某个随机点它会停止(尽管仅适用于查找版本),正常版本只是运行而不会停止。
不可能是递归限制,可能是字典太大了?不过,它并没有使用太多内存。
这是代码:
import time, sys
sys.setrecursionlimit(100000)
lookup = {}
def ackermann(m,n,look):
if (m,n) in lookup and look: #Checks if the pair is in the table
print("pair found")
return lookup[(m,n)]
else: #Regular ackermann
if m == 0:
print("Base found for {} {}".format(m,n))
return n+1
if n == 0:
print("Case 2: {} {}".format(m,n))
result = ackermann(m-1,1,look)
if look:
lookup[m,n] = result
return result
else:
print("Case 3: {} {}".format(m,n))
result = ackermann(m-1,ackermann(m,n-1,look),look)
if look:
lookup[m,n] = result
return result
def call_ack(m,n):
t1= time.time()
result1 = ackermann(m,n,True)
t2= time.time()
result2 = ackermann(m,n,False)
t3= time.time()
print("Result with lookup:",result1, "\nElapsed time:",t2-t1)
print("\nResult without lookup:",result2, "\nElapsed time:",t3- t2)
print("Difference: ", t3+t1-t2*2)
这是其中一个输出的最后一部分:
Case 3: 1 7947
Case 3: 1 7946
pair found
Base found for 0 7947
Base found for 0 7948
Case 3: 1 7949
Case 3: 1 7948
如果我再次运行它:
Case 3: 2 4695
Case 3: 2 4694
Case 3: 2 4693
Case 3: 2 4692
Case 3: 2 4691
Case 3: 2 4690
Case 3: 2 4689
Case 3: 2 4688
Case 3: 2 4687
Case 3: 2 4686
Case 3: 2 4685
Case 3: 2 4684
Case 3: 2 4683
Case 3: 2 4682
Case 3: 2 4681
Case 3: 2 4680
Case 3: 2 4679
无需改变任何东西。哦,男孩,我喜欢不一致的结果!值得注意的是,对于较小的值,它运行得非常完美。
编辑:我刚刚尝试过这个在线python解释器,它工作得很好。
编辑2:我试过用另一个版本的python(3.8.2而不是3.7)运行它,它以堆栈溢出错误关闭。问题是它几乎没有使用内存 - 根据任务管理器最多 6.6 MB。