簡體   English   中英

為什么我收到索引超出范圍錯誤?

[英]why do i recieve index out of range error?

我試圖做斐波那契數列,但是不是想用過去的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],但是出現錯誤索引超出范圍

在第二個示例中,您要處理兩個不同的列表: tribosignature 當增加i的索引時,嘗試從signature獲取該索引-但signature僅包含三個元素,因此,當i*3 > 2 ,會得到IndexError

解決這個問題的更好方法是使用原始代碼,而不是創建兩個不同的數組,然后從返回的數組中切出前三個元素:

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

不必必須具有三個不同的變量來存儲這三個元素,您還可以利用python的否定列表傾向 (從后數而不是從前數)的想法。 這樣做的更tribonacci的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

我相信錯誤在於調用數組:

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM