Python ::“IndexError:列表索引超出范围”
我正在试验一些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
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
我很确定这不是那么简单 - 他在进行n + 1调用之前用一个新项目扩展了''C,所以这个列表正在扩展。 – 2015-02-09 13:50:54
哇,你们很快 - 我的帖子被纠正和回答之前,我可以自己修复我的帖子(甚至认为)。哈哈 – 2015-02-09 13:54:55
非常感谢!这就说得通了。我确实有更多的代码会每10次迭代一次提示用户,但为了简单起见,我将其留下。 – 2015-02-09 13:56:12
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)
好了,它看起来像什么凯文说是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
请不要对此做出新的回答,只需使用评论并接受最佳答案;这只是@凯文的答案,加入了一个提示功能 – 2015-03-20 21:56:52
它听起来像你超越你的数组的大小 – jgr208 2015-02-09 13:50:22
你接着说:1'到'N' ** **两次,但只有一个元素被添加到'C'。 – 2015-02-09 13:54:15
值得注意的是,当你想将一个元素添加到列表中而不是执行list + = [element](它会创建一个额外的列表)时,会出现'list.append(element)'。你可能还想看看[python style guide](https://www.python.org/dev/peps/pep-0008/) - 诸如奇数间距和使用奇数capitilisation来表示变量名称会导致代码难以阅读。 – 2015-02-09 13:55:53