Python斐波那契代码错误

Python斐波那契代码错误,python,runtime-error,fibonacci,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:]): e

我正在尝试编写迭代查找第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'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
fib2(5)
文件“/Users/blah/Documents/myTest.py”,第16行,在fib2中
元素=myarr[index-1]+myarr[index-2]
TypeError:+:“非类型”和“非类型”的操作数类型不受支持
枚举()
总是从0开始计数;它无法知道您已将列表切片:

for index, element in enumerate(myarr[3:]):
这里的
index
0
开始,所以当您使用
index-1
index-2
时,您试图从末尾开始索引;这些转换为
myarr[-1]
myarr[-2]
。这些条目仍然设置为
None

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

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

for index, element in enumerate(myarr[3:], 3):
    myarr[index] = myarr[index - 1] + myarr[index - 2]
或者相应地调整您的
索引
计算:

for index, element in enumerate(myarr[3:]):
    myarr[index + 3] = myarr[index + 2] + myarr[index + 1]
请注意,现在不再使用
元素
变量。您可以从
myarr[2:][/code>开始迭代:

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
def fib(n):

如果n您的
for
循环实际上没有修改列表。您必须修改列表本身,而不是指定给
元素

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

哦,天哪,你没有添加任何内容,也没有要创建的内容。。。没什么@Zizouz212你能告诉我哪些代码行正在这样做吗?我以为我在做myArr[3]=1+1,myArr[4]=2+1等等。苏的一些最喜欢的人对这些答案感到惊讶。他们会让你完全理解它。:)为什么要执行
myarr=[None]*(n+1)
?这不是C,你不需要用空值初始化数组(Python中称为列表);它只是重复了OP的功能。@MartijnPieters谢谢,这很详细,很有帮助!我想澄清的一件事是您所说的:“您也没有将值赋回列表;重新绑定元素不会更新原始列表值。”您能解释一下为什么会出现这种情况吗?我认为Python中的作用域规则是局部函数、封闭函数局部函数、全局函数和内置函数。既然“element”在一个局部函数(fib2)中,为什么不给它赋值呢?@randomUser47534:赋值给
element
效果很好,但是重新绑定名称
element
与在
myarr
中重新绑定索引是不同的。
for
循环从
enumerate()
函数接收值,该函数依次从
myarr
提取值,并将这些值分配给
元素
名称。因此在循环体中,
myarr[i]
element
都引用相同的整数对象。将不同的整数赋给
元素
只会改变
元素
所指的内容,
myarr[i]
保持不变。