Python斐波那契代码错误
我正在尝试编写迭代查找第n个斐波那契数的代码。我已经在下面编写了代码(使用自底向上的方法),但是我得到了以下错误。你能解释一下错误是什么吗?谢谢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
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]
保持不变。