我正在尝试编写迭代找到第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'
答案 0 :(得分:3)
enumerate()
始终从0开始计数;它无法知道你切了你的名单:
for index, element in enumerate(myarr[3:]):
此处index
从0
开始,因此当您使用index - 1
和index - 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