为什么我收到索引超出范围错误?

时间:2019-07-10 19:21:51

标签: python

我试图做斐波那契数列,但不是用第2个过去的数字做第三个数字,而是想用最后3个数字做第四个数字 我的第一个代码是:

def tribonacci(signature, n):
    a, b, c = signature
    tribo = [signature[0],signature[1],signature[2]]

    for i in range(n):
        s = a+b+c
        a = b
        b = c
        c = s
        tribo.append(c)
    return tribo

print(tribonacci([1, 1, 1], 10))

我收到[1、1、1、3、5、9、17、31、57、105、193、355、653],这意味着该序列以数字3开头,而不是以第一个1开头。我不想将“签名”值附加到数组,而是开始将每个值添加到数组

所以我尝试了以下代码:

def tribonacci(signature, n):
    tribo = []

    for i in range(0, n):
        a = signature[i]
        b = signature[2*i]
        c = signature[3*i]
        s = a+b+b
        a = b
        b = c
        c = s
        tribo.append(c)
    return tribo


print(tribonacci([1, 1, 1], 10))

我原本希望得到此值[1、1、1、3、5、9、17、31、57、105],但是出现错误索引超出范围

2 个答案:

答案 0 :(得分:1)

在第二个示例中,您要处理两个不同的列表:tribosignature。当您增加i的索引时,尝试从signature中获取该索引-但是signature仅包含三个元素,因此当i*3 > 2时,您得到一个{{1 }}。

解决这个问题的更好方法是使用原始代码,而不是制作两个不同的数组,然后从返回的数组中切出前三个元素:

IndexError

您不必使用三个不同的变量来存储这三个元素,还可以利用python的负列表包含量(从后数而不是从前数)的想法。为此,def tribonacci(signature, n): a, b, c = signature ... return tribo[3:] 的更简洁的实现可能是这样的:

tribonacci

尽管如果给定的def tribonacci(signature, n): tribo = signature[:] # copy the contents of signature, to start with for i in range(n): # add the last three elements of tribo together, and append the sum tribo.append( tribo[-1] + tribo[-2] + tribo[-3] ) return tribo[3:] 少于3个元素,这将为您提供IndexError

答案 1 :(得分:1)

我相信错误在于调用数组:

for i in range(0, n):
    a = signature[i]
    b = signature[2*i]
    c = signature[3*i]

...应该是...

for i in range(0, n):
    a = signature[i]
    b = signature[1+i]
    c = signature[2+i]

否则,当n = 10时,您将访问签名(30),该签名不存在。

也存在其他错误,例如s=a+b+b而不是s=a+b+c,仅此编辑不能解决问题,但是这很可能就是您收到超出范围的错误的原因。

否则,最大的错误是使用两个不同的数组。您的tribo数组永远不会以开头的1初始化,因此无法成为所需的结果。尝试保留您的核心代码,我只需将for循环的范围更改为(0, n-3)或使用signature代替tribo。

def tribonacci(signature, n):
    for i in range(0, n-3):
        a = signature[i]
        b = signature[1+i]
        c = signature[2+i]
        s = a+b+c
        a = b
        b = c
        c = s
        signature.append(c)
    return signature
print(tribonacci([1, 1, 1], 10))