Python斐波那契代码错误

时间:2015-05-17 02:44:05

标签: python runtime-error fibonacci

我正在尝试编写迭代找到第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'

2 个答案:

答案 0 :(得分:3)

enumerate()始终从0开始计数;它无法知道你切了你的名单:

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

此处index0开始,因此当您使用index - 1index - 2时,您尝试从结尾索引;这些转化为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的可迭代分配效果很好。

答案 1 :(得分:0)

您的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