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

2024-06-18 18:47:07 发布

您现在位置: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开始。但我不想将“signature”值附加到数组中,而是开始将每个值添加到数组中

所以我尝试了以下代码:

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],但是错误索引超出了范围


Tags: in密码forreturndefrange序列数字
2条回答

我认为错误在于调用数组:

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)。你知道吗

还有其他的bug,比如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))

在第二个示例中,您将处理两个不同的列表:tribosignature。当您增加i的索引时,您尝试从signature获取该索引-但是signature只有三个元素,因此当i*3 > 2时,您会得到一个IndexError。你知道吗

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

def tribonacci(signature, n):
    a, b, c = signature
    ...
    return tribo[3:]

不必使用三个不同的变量来存储这三个元素,您还可以利用python的负面列表incides的思想(从后面而不是前面开始计算)。执行此操作的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:]

如果给定的signature小于3个元素,那么这将给您一个IndexError。你知道吗

相关问题 更多 >