【问题标题】:Python:: "IndexError: list index out of range"Python::“IndexError:列表索引超出范围”
【发布时间】:2015-02-09 13:48:14
【问题描述】:

我正在尝试一些 python 编程元素,并尝试在此过程中生成一个加泰罗尼亚数字数组。

我不断收到上述错误,但我似乎无法解释原因或找到任何启​​发性的信息来源。

该函数使用当前元素计算列表 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

【问题讨论】:

  • 听起来你超出了数组的大小
  • 您将1 添加到n 两次,但只向C 添加了一个元素。
  • 值得注意的是list.append(element) 存在于您想要将单个元素添加到列表中,而不是执行 `list += [element] (这会创建一个额外的列表)。您可能还想查看python style guide - 诸如奇数间距和对变量名称使用奇数大写字母会使代码难以阅读。
  • 看起来你可能也遇到了无限递归的问题。
  • 另外,你可能想看看 a generator 做这种事情 - 比建立这样的列表更高效、更容易编写。

标签: python list


【解决方案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

【讨论】:

  • 我很确定这不是那么简单 - 他在拨打 n+1 之前使用新项目扩展了 C,因此列表正在扩大。
  • 哇,你们真快——在我自己修复我的帖子(甚至思考)之前,我的帖子得到了更正和回复。哈哈
  • 非常感谢!那讲得通。我确实有更多代码每 10 次迭代就提示用户一次,但为了简单起见,我省略了它。
【解决方案2】:

加泰罗尼亚数字可以完全迭代生成,因此你可以将你的函数变成一个生成器:

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)

【讨论】:

    【解决方案3】:

    好吧,看起来 Kevin 说的是真的——它在数组被扩展以解决它之前第二次遇到递归并递增。另外,加泰罗尼亚语号码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 
    

    【讨论】:

    • 请不要为此做出新的答案,使用 cmets 并接受最佳答案即可;这只是@Kevin 的答案,其中添加了提示功能
    猜你喜欢
    • 2016-08-25
    • 2017-04-05
    • 2012-07-15
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多