在 python 斐波那契程序中出现索引错误
Getting an index error in a python fibonacci program
我刚开始 "Algorithmic toolbox" Coursera,并且正在 python 2.7
中编写他们的斐波那契程序版本
def fibonacci(n):
F = []
F[0] = 0
F[1] = 1
for i in range(0,n):
F[i] = F[i-1] + F[i-2]
return F[n]
fibonacci(3)
但是,我一直收到这个错误:
Traceback (most recent call last):
File "fibonacci.py", line 11, in <module>
fibonacci(3)
File "fibonacci.py", line 3, in fibonacci
F[0] = 0
IndexError: list assignment index out of range
您需要从 2 而不是 0 开始循环。
def fibonacci(n):
F = [0,1]
if n<0:
return None
if n<2:
return F[n]
for i in range(2,n):
F[i] = F[i-1] + F[i-2]
return F[n]
fibonacci(3)
您的代码有几个问题:
def fibonacci(n):
F = [] #3
F[0] = 0
F[1] = 1
for i in range(0,n):
F[i] = F[i-1] + F[i-2] #1
return F[n] #2
第一次迭代将是 F[0] = F[-1] + F[-2]
,Python 中定义明确,但不是您想要的。您可能想查看 Python 的索引方案。
F[n]
指的是第 n+1 个元素,因为 Python 是 0 索引。范围是 [lower, upper),所以在最后一次迭代中它实际上没有 i = n
。
正如 Martijn 在下面评论的那样,第三个问题是您不能简单地索引到一个空列表中。您必须连续追加,或者将整个列表分配为 F = [0]*n
.
您不能通过分配给不存在的索引来在 Python 列表中创建 new 元素。您的列表为空,因此索引 0
和 1
不存在 .
改用list.append()
:
def fibonacci(n):
F = [0, 1] # a list with two initial elements
for i in range(2, n + 1):
F.append(F[i-1] + F[i-2]) # add new value to the list
return F[n]
请注意,循环从 2
开始,而不是 0
,因为您已经有了 0
和 [=14] 的值=]. range()
的停止参数 不包括 所以如果你想找到第 n
个斐波那契数,你需要 运行 范围到n + 1
。
现在代码可以工作了:
>>> def fibonacci(n):
... F = [0, 1]
... for i in range(2, n + 1):
... F.append(F[i-1] + F[i-2])
... return F[n]
...
>>> fibonacci(10)
55
请注意,您实际上并不需要将所有值都存储在一个列表中;您只需要跟踪 最后 2。您可以只使用两个变量并在每次迭代时交换它们;一个存储
def fibonacci(n):
prev, curr = 0, 1 # two variables, one set to 0, the other to 1
for _ in range(n - 1): # run n - 2 times
prev, curr = curr, prev + curr
return curr
请注意,这不会对 n
进行任何边界测试,因此对于 n = 0
,结果将不正确(返回 1 而不是 0)。这很容易通过顶部的 if n < 1: return 0
行来解决。
这是因为当程序到达 F[0]
时,它会尝试评估 F
的第 0 个索引中的内容。问题在于 F
最初是一个空列表,因此没有第 0 个索引。您想要使用 F.append(0)
和 F.append(1)
来附加这些元素。
您必须将值附加到列表,因为它的大小为 0。Python 当您在下一个索引处添加项目时,列表不会自动增长,您必须指定它,例如使用 append
函数
F = []
F.append(0)
F.append(1)
# [0, 1]
# OR
F = [0, 1]
# [0, 1]
我刚开始 "Algorithmic toolbox" Coursera,并且正在 python 2.7
中编写他们的斐波那契程序版本def fibonacci(n):
F = []
F[0] = 0
F[1] = 1
for i in range(0,n):
F[i] = F[i-1] + F[i-2]
return F[n]
fibonacci(3)
但是,我一直收到这个错误:
Traceback (most recent call last):
File "fibonacci.py", line 11, in <module>
fibonacci(3)
File "fibonacci.py", line 3, in fibonacci
F[0] = 0
IndexError: list assignment index out of range
您需要从 2 而不是 0 开始循环。
def fibonacci(n):
F = [0,1]
if n<0:
return None
if n<2:
return F[n]
for i in range(2,n):
F[i] = F[i-1] + F[i-2]
return F[n]
fibonacci(3)
您的代码有几个问题:
def fibonacci(n):
F = [] #3
F[0] = 0
F[1] = 1
for i in range(0,n):
F[i] = F[i-1] + F[i-2] #1
return F[n] #2
第一次迭代将是
F[0] = F[-1] + F[-2]
,Python 中定义明确,但不是您想要的。您可能想查看 Python 的索引方案。F[n]
指的是第 n+1 个元素,因为 Python 是 0 索引。范围是 [lower, upper),所以在最后一次迭代中它实际上没有i = n
。正如 Martijn 在下面评论的那样,第三个问题是您不能简单地索引到一个空列表中。您必须连续追加,或者将整个列表分配为
F = [0]*n
.
您不能通过分配给不存在的索引来在 Python 列表中创建 new 元素。您的列表为空,因此索引 0
和 1
不存在 .
改用list.append()
:
def fibonacci(n):
F = [0, 1] # a list with two initial elements
for i in range(2, n + 1):
F.append(F[i-1] + F[i-2]) # add new value to the list
return F[n]
请注意,循环从 2
开始,而不是 0
,因为您已经有了 0
和 [=14] 的值=]. range()
的停止参数 不包括 所以如果你想找到第 n
个斐波那契数,你需要 运行 范围到n + 1
。
现在代码可以工作了:
>>> def fibonacci(n):
... F = [0, 1]
... for i in range(2, n + 1):
... F.append(F[i-1] + F[i-2])
... return F[n]
...
>>> fibonacci(10)
55
请注意,您实际上并不需要将所有值都存储在一个列表中;您只需要跟踪 最后 2。您可以只使用两个变量并在每次迭代时交换它们;一个存储
def fibonacci(n):
prev, curr = 0, 1 # two variables, one set to 0, the other to 1
for _ in range(n - 1): # run n - 2 times
prev, curr = curr, prev + curr
return curr
请注意,这不会对 n
进行任何边界测试,因此对于 n = 0
,结果将不正确(返回 1 而不是 0)。这很容易通过顶部的 if n < 1: return 0
行来解决。
这是因为当程序到达 F[0]
时,它会尝试评估 F
的第 0 个索引中的内容。问题在于 F
最初是一个空列表,因此没有第 0 个索引。您想要使用 F.append(0)
和 F.append(1)
来附加这些元素。
您必须将值附加到列表,因为它的大小为 0。Python 当您在下一个索引处添加项目时,列表不会自动增长,您必须指定它,例如使用 append
函数
F = []
F.append(0)
F.append(1)
# [0, 1]
# OR
F = [0, 1]
# [0, 1]