0

我是 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

如果我的值超过 1500,它会给我一个越界错误。然而,缓存应该被初始化为一百万个整数。我错过了什么吗?谢谢

4

2 回答 2

3

这个函数可以在最终崩溃之前任意增长。

您可能只是在达到某个数字,使其增长速度快于崩溃一段时间。如果您输入的内容比您传入的内容多 1 或少 1,您可能不会遇到问题。

如果你真的想缓存结果,字典比 Python 中的稀疏数组列表更合适。

于 2012-06-08T01:02:06.700 回答
3

现在更新代码已发布:

在 1500 之前我似乎没有遇到任何问题。我确实得到了一个 IndexError for func(1819),i 进化为此开始了

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这种方式,但我做什么取决于你想要做什么。

于 2012-06-08T00:43:40.800 回答