Python-大型初始化列表上的索引超出范围
我是Python的初学者,遇到了一个奇怪的越界错误 我的想法是,我需要使用以下方法初始化缓存:Python-大型初始化列表上的索引超出范围,python,Python,我是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:
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,则会产生越界错误。但是,缓存应该初始化为一百万整数。我错过什么了吗?谢谢代码发布后立即更新: 到1500年为止,我似乎没有遇到任何问题。对于
func(1819)
,我确实得到了一个索引器,对于这个索引器,我的进化开始了
1819
5458
2729
最后在
851290
425645
1276936
[...]
IndexError: list index out of range
但这不是一个bug,这只是一个事实,它比你腾出的空间要高。您可以使用字典而不是列表来避免此问题
--
要说清楚,我想说的是:
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
,但我会做什么取决于你想做什么。代码发布后更新:
到1500年为止,我似乎没有遇到任何问题。对于func(1819)
,我确实得到了一个索引器,对于这个索引器,我的进化开始了
1819
5458
2729
最后在
851290
425645
1276936
[...]
IndexError: list index out of range
但这不是一个bug,这只是一个事实,它比你腾出的空间要高。您可以使用字典而不是列表来避免此问题
--
要说清楚,我想说的是:
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个或少1个,你可能不会遇到问题
如果您真的想缓存结果,DICT比Python中稀疏数组的列表更合适。此函数可以在最终崩溃之前任意增长 你可能只是碰到了一个数字,使得它在一段时间内增长得比崩溃得快。如果你输入的比你输入的多1个或少1个,你可能不会遇到问题
如果您真的想缓存结果,DICT比Python中稀疏数组的列表更合适。
k
也没有明确提到。。。我们假设i
初始化为2或更大。i将在1到1000000@HarrisonHe:仅保证i=2**k
的collatz序列保持在i
以下<例如,code>i=3在返回到1之前先升到16。嗯,如何将字典初始化为一百万个值?我也没有完全理解这个列表structure@HarrisonHe:不需要,只需在值出现时添加它们。k
也没有明确提到。。。我们假设i
初始化为2或更大。i将在1到1000000@HarrisonHe:仅保证i=2**k
的collatz序列保持在i
以下<例如,code>i=3在返回到1之前先升到16。嗯,如何将字典初始化为一百万个值?我也没有完全理解这个列表structure@HarrisonHe:如果没有,则在出现值时添加它们。k
、a
和i
在循环之前没有明确提到。你能发布更多的代码吗,比如它包含了这些变量的初始化?对不起,添加了一个更完整的代码最终数组将作为一个参数传入,但我在函数中初始化了它,以消除导致错误的任何其他原因Collatz猜想,嗯?在这里预先初始化数组是浪费内存(和时间)。这是一次记忆化尝试吗?如果您想让记忆化发挥任何作用,您需要在调用函数之间保留数据。k
、a
和i
在循环之前没有明确提到。你能发布更多的代码吗,比如它包含了这些变量的初始化?对不起,添加了一个更完整的代码最终数组将作为一个参数传入,但我在函数中初始化了它,以消除导致错误的任何其他原因Collatz猜想,嗯?在这里预先初始化数组是浪费内存(和时间)。这是一次记忆化尝试吗?如果您想让记忆化发挥任何作用,则需要在调用函数之间保留数据。