我在玩递归阿克曼函数。对于某些值,我的提示不会显示每个计算的输出,因为 Python 会如此快地超过其递归限制,以至于在“简单”部分赶上它之前冻结提示。
所以我想我可以在函数完全执行后添加一个递归计数器和一个快速暂停。我得到了预期的输出,直到它达到值 (1,0)。之后我得到了一个TypeError: can only concatenate tuple (not "int") to tuple
.
我的代码如下:
import time
import sys
sys.setrecursionlimit(3000)
def ackermann(i,j,rec):
output = None
if i==0:
output = j+1
elif j==0:
output = ackermann(i-1,1,rec)
rec=rec+1
else:
output = ackermann(i-1,ackermann(i,j-1,rec),rec)
rec=rec+1
return output,rec
rec=0
for i in range(5):
for j in range(5):
print("(",i,",",j,")= ",ackermann(i,j,rec))
time.sleep(2)
请注意,删除rec
(我的递归计数器)的所有实例,程序运行正常。(您可以看到 values 的所有输出i,j = 3
)
有人可以指出如何更正我的代码或提出一种不同的方法来查找 Ackermann 函数调用自身的次数吗?
另外,我注意到将限制设置为 5000 会使我的 python 内核崩溃得非常快。有上限吗?
我使用最新的 Anaconda。
编辑
我尝试使用列表作为具有以下数据的参数来实现相同的功能[i,j,output,#recursion]
import time
import sys
sys.setrecursionlimit(3000)
def ackermann(*rec):
rec=list(rec)
print(rec) # see the data as they initialize the function
if rec[0][0]==0:
rec[0][1]=rec[0][1]+1
rec[0][2] = rec[0][1]+1
elif rec[0][1]==0:
rec[0][0]=rec[0][0]-1
rec[0][1]=1
rec = ackermann()
rec[0][3]=rec[0][3]+1
else:
rec[0][0]=rec[0][0]-1
rec[0][1] = ackermann()
rec = ackermann()
rec[0][3]=rec[0][3]+1
return rec
for i in range(5):
for j in range(5):
rec=[i,j,0,0]
print(ackermann(rec))
time.sleep(1)
但是这次我得到了一个IndexError: list index out of range
,因为由于某种未知原因,我的列表被清空了
输出:
[[0, 0, 0, 0]]
[[0, 1, 2, 0]]
[[0, 1, 0, 0]]
[[0, 2, 3, 0]]
[[0, 2, 0, 0]]
[[0, 3, 4, 0]]
[[0, 3, 0, 0]]
[[0, 4, 5, 0]]
[[0, 4, 0, 0]]
[[0, 5, 6, 0]]
[[1, 0, 0, 0]]
[]