Python斐波那契代码错误

Python fibonacci code error

我正在尝试编写迭代查找第 n 个斐波那契数的代码。我在下面编写了我的代码(使用自下而上的方法),但出现以下错误。你能解释一下错误是什么吗?谢谢

def fib2(n):
    if n == 1 or n == 2:
        return 1
    myarr = [None] * (n + 1)

    myarr[1] = 1
    myarr[2] = 1

    for index, element in enumerate(myarr[3:]):
        element = myarr[index - 1] + myarr[index - 2]

    return myarr[n]

错误:

Traceback (most recent call last):
  File "<pyshell#33>", line 1, in <module>
    fib2(5)
  File "/Users/blah/Documents/myTest.py", line 16, in fib2
    element = myarr[index - 1] + myarr[index - 2]
TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

enumerate() 总是从 0 开始计数;它无法知道您对列表进行了切片:

for index, element in enumerate(myarr[3:]):

此处 index0 开始,因此当您使用 index - 1 和 [=19] 时,您试图从 末尾索引 =];这些转换为 myarr[-1]myarr[-2]。这些条目仍设置为 None.

您也没有将值分配回列表;重新绑定 element 不会更新原始列表值。

您可以给 enumerate() 第二个参数以提供不同的起始值:

for index, element in enumerate(myarr[3:], 3):
    myarr[index] = myarr[index - 1] + myarr[index - 2]

或相应地调整您的index计算:

for index, element in enumerate(myarr[3:]):
    myarr[index + 3] = myarr[index + 2] + myarr[index + 1]

请注意,现在不再使用 element 变量。您可以改为从 myarr[2:]:

开始迭代
for index, element in enumerate(myarr[2:]):
    myarr[index + 2] = myarr[index + 1] + element

由于您只需要最后 2 个值,经典迭代 Python 实现仅使用 2 个变量,而不是列表:

def fib(n):
    if n <= 2:
        return 1

    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b

    return a

它使用 Python 的可迭代赋值效果很好。

您的 for 循环实际上并没有修改列表。您必须修改列表本身而不是分配给 element:

for index in range(3, len(myarr)):
    myarr[index] = myarr[index - 1] + myarr[index - 2]

此外,由于您只需要最后两项来计算下一项,您甚至不需要列表:

def fib(n):
    a, b = 0, 1

    for i in range(n):
        a, b = b, a + b

    return a