2012-06-08 25 views
0

我是Python的初學者,並且出現了一個奇怪的越界錯誤。Python - 在大型初始化列表上的索引超出範圍

的想法是,我需要使用緩存初始化:

arr = [0]*1000000 

然後在同一個函數訪問,如果i的值超過1500它給了我一個不折不扣的調用

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 

邊界錯誤。但是,緩存應該初始化爲一百萬英寸。我錯過了什麼嗎?由於

+0

在循環之前沒有明確提到'k','a'和'i'。你可以發佈一些更多的代碼,這樣它包括這些變量的初始化? – Makoto

+0

對不起,添加了一個更完整的代碼 –

+0

最終該數組將被作爲參數傳入,但我在函數中初始化它以消除任何其他錯誤原因 –

回答

3

現在的代碼發佈更新:

我似乎並沒有得到任何的問題多達1500我得到func(1819)一個IndexError,爲此,我開始演變

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這種方式,但是我確實取決於你想要做什麼。

+0

'k'沒有完全明確地提及,要麼......並且我們假設「i」被初始化爲2或更大。 – Makoto

+0

我將在1到1000000範圍內 –

+1

@HarrisonHe:只有'i = 2 ** k'的collat​​z序列才能保證低於'i'。例如,「i = 3」,在返回到1之前上升到16。 –

3

該功能在最終崩潰之前可以任意增長。

您可能只是觸及了一些數字,使其增長速度超過了一段時間。如果你輸入1或更多,那麼你可能不會遇到問題。

如果你想真的想要緩存結果,那麼字典比Python中的稀疏數組列表更適合。