无法防止斐波那契 'for' 循环迭代中的 'list index out of range' 错误

Unable to prevent 'list index out of range' error in fibonacci 'for' loop iteration

我仍然是 Python 的初学者,我正在尝试优化函数以生成指定数量的值的斐波那契数列。这是我写的代码:

def attempt2(length):
    listy=[]
    for i in range(0,length+1):
        if i == 0:
            listy.append(1)
        elif i == 1:
            listy.append(1)
        else:
            listy.append(listy[i]+listy[i-1])
    return listy

虽然保留了这个结构,但我没有找到克服 'list index out of range' 错误的方法。我认为因为当 i = 0 时 listy[i-1] 会超出范围,但是如果函数在循环中线性进行,那么 else 语句应该只在 i = 2 时生效。任何人都可以看到我在做什么错了?

谢谢!

因此,要找出问题的根源,我们需要退后一步,看看您的循环在做什么。

最初,您的 for 循环从 0 计数到任何长度,让我们看看 i 的值会是什么样子:

0 1个 2个 ...

所以从2开始,因为定义了0,1的行为:

listy.append(listy[2]+listy[1])

请记住,listy 现在有 2 个项目,零索引,换句话说,项目是 1 和 0,因此项目 listy[2] 不存在。

因此,您的代码应该是

listy.append(listy[i-2]+listy[i-1])

总的来说这不是一个好的解决方案,但一个小错误是您应该将第 9 行更改为:

            listy.append(listy[i - 1] + listy[i - 2])

此外,您将拥有一个“长度 + 1”尺寸列表,而不是“长度”。

您使用的列表索引有误

def attempt2(length):
    listy=[]
    for i in range(0,length):
        if i == 0:
            listy.append(1)
        elif i == 1:
            listy.append(1)
        else:
            listy.append(listy[i -1]+listy[i - 2])
    return listy

print(attempt2(12))

#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

Listy[-1] returns 列表的最后一个元素。
列表位置初始化为 0 而不是 1。
当 i = 2 时,在你的 else 语句中 listy.append(listy[i]+listy[i-1]) 等同于 listy.append(listy[2]+listy[1])
然而,第二个循环后的列表等于 [1,1]。
最大位置为 1,而 2 超出范围。
def loop_fib(n):
    # first two numbers are 1
    fib_1=1
    fib_2=1
    res=[1,1]
    # n is inclusive
    for i in range(3,n+1):
        # new fib_2=fib_1+fib_2
        # new fib_1=old fib_2
        fib_1,fib_2=fib_2,fib_1+fib_2
        res.append(fib_2)
    return res


loop_fib(10)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]