2015-02-09 222 views
0

我正在試驗一些python編程元素,並試圖在過程中生成一個加泰羅尼亞數字數組。Python ::「IndexError:列表索引超出範圍」

我不斷收到上述錯誤,但似乎無法解釋爲什麼或找到任何有啓發性的信息來源。

函數使用當前元素計算列表C的下一個元素,從C [0] = 0開始。

我減少了我的代碼,使事情更簡單,但仍保留錯誤。

from math import * 

C = [] 
C += [0] 
def ppC(n,C): # increment list C 
    print(C[n]) # list index out of range 
    C += [ C[n]*(4*n+2)/(n+2) ] 
    n += 1 
    ppC(n+1,C) # recursive 

ppC(0,C)  # RUN 
+0

它聽起來像你超越你的數組的大小 – jgr208 2015-02-09 13:50:22

+0

你接着說:1'到'N' ** **兩次,但只有一個元素被添加到'C'。 – 2015-02-09 13:54:15

+0

值得注意的是,當你想將一個元素添加到列表中而不是執行list + = [element](它會創建一個額外的列表)時,會出現'list.append(element)'。你可能還想看看[python style guide](https://www.python.org/dev/peps/pep-0008/) - 諸如奇數間距和使用奇數capitilisation來表示變量名稱會導致代碼難以閱讀。 – 2015-02-09 13:55:53

回答

1
n += 1 
ppC(n+1,C) # recursive 

有了這兩條線,你到ppC秒呼叫將具有n值的2,這是一個過去的陣列的端部。只嘗試一次遞增n。

from math import * 

C = [] 
C += [0] 
def ppC(n,C): # increment list C 
    print(C[n]) # list index out of range 
    C += [ C[n]*(4*n+2)/(n+2) ] 
    ppC(n+1,C) # recursive 

ppC(0,C)  # RUN 

你或許應該也有某種檢查,以確定何時應該停止產生號碼,否則該功能將永遠運行。 (或者更確切地說,它會運行一個千倍和崩潰與「最大遞歸深度超過」錯誤。)例如:

from math import * 

C = [] 
C += [1] 
def ppC(n,C): # increment list C 
    print(C[n]) # list index out of range 
    C += [ C[n]*(4*n+2)/(n+2) ] 
    if len(C) > 100: 
     return 
    ppC(n+1,C) # recursive 

ppC(0,C)  # RUN 

一件事。是不是第一個加泰羅尼亞號,而不是零?

from math import * 

C = [] 
C += [1] 
def ppC(n,C): # increment list C 
    print(C[n]) # list index out of range 
    C += [ C[n]*(4*n+2)/(n+2) ] 
    if len(C) > 10: 
     return 
    ppC(n+1,C) # recursive 

ppC(0,C)  # RUN 

結果:

1 
1 
2 
5 
14 
42 
132 
429 
1430 
4862 
+0

我很確定這不是那麼簡單 - 他在進行n + 1調用之前用一個新項目擴展了''C,所以這個列表正在擴展。 – 2015-02-09 13:50:54

+0

哇,你們很快 - 我的帖子被糾正和回答之前,我可以自己修復我的帖子(甚至認爲)。哈哈 – 2015-02-09 13:54:55

+0

非常感謝!這就說得通了。我確實有更多的代碼會每10次迭代一次提示用戶,但爲了簡單起見,我將其留下。 – 2015-02-09 13:56:12

0

Catalan數完全可以重複生產的,因此,你可以讓你的函數變成發電機:

def catalans(): 
    C = 1 
    n = 0 
    while True: 
     yield C 
     C = 2 * (2 * n + 1) * C // (n + 2) 
     n += 1 

# then to get 100 first numbers in a list, you can do 
from itertools import islice 
print(list(islice(catalans(), 100))) 

# or print forever: 
for i in catalans(): 
    print(i) 
0

好了,它看起來像什麼凱文說是true - 在數組展開以解釋它之前,它正在進行遞歸併再次遞增。另外,加泰羅尼亞號碼C[0]=1

這裏是我的全部(現在全功能)代碼:

from math import * 

C = [] 
C += [1] 
def ppC(n,C): 
    print(C[n]) 
    C += [ C[n]*(4.*n+2)/(n+2) ] 
    if prompt(n) == 1: 
     ppC(n+1,C) 

def prompt(n): 
    if n%10 == 0: 
     print("continue?") 
     m = raw_input("(y/n)") 
     if m != "y": 
      return 0 
     else: 
      return 1 
    else: 
     return 1 

ppC(0,C)  # RUN 
+0

請不要對此做出新的回答,只需使用評論並接受最佳答案;這只是@凱文的答案,加入了一個提示功能 – 2015-03-20 21:56:52

相關問題