我是Python的初学者,我遇到了一个奇怪的出界错误。
我的想法是我需要使用以下命令初始化缓存:
arr = [0]*1000000
然后通过调用
在同一个函数中访问def func (i) :
k=1
a = i
arr = [0]*1000000
while (i>1):
if arr[i] != 0:
k = k + arr[i] - 1
break
if i%2 == 0:
i = i/2
else:
i = 3*i + 1
k += 1
arr[a] = k
return k
如果值i超过1500,它会给我一个越界错误。但是,缓存应该被初始化为一百万个整数。我错过了什么吗?感谢
答案 0 :(得分:3)
现已更新代码已发布:
我似乎没有遇到任何问题,直到1500.我做获得func(1819)
的IndexError,i evolution开始为
1819
5458
2729
并结束
851290
425645
1276936
[...]
IndexError: list index out of range
但这不是一个错误,这只是一个事实,它比你腾出的空间更高。您可以使用字典而不是列表来避免此问题。
-
要清楚,这就是我想到的那种事情:
def func_with_dict(i) :
k=1
a = i
arr = {}
while (i>1):
print i
if i in arr:
k = k + arr[i] - 1
break
if i%2 == 0:
i = i/2
else:
i = 3*i + 1
k += 1
arr[a] = k
return k
产生
1819
5458
2729
8188
[...]
851290
425645
1276936
638468
319234
[...]
20
10
5
16
8
4
2
和162的最终答案。虽然我不认为我会以这种方式使用arr
,但我将做什么取决于你想要做什么做。
答案 1 :(得分:3)
此函数在最终崩溃之前可以任意增长。
你可能只是打了一些数字,这使得它的成长速度比它崩溃了一段时间。如果你输入的数量比你传入的少一个或少一个,你可能不会遇到问题。
如果确实想要缓存结果,那么dicts比Python中的稀疏数组列表更合适。