2015-02-09 179 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

相关问题