在python fibonacci程序中获取索引错误

时间:2016-05-25 00:05:39

标签: python list fibonacci

我刚在Coursera上开始使用“算法工具箱”,并在python 2.7中编写了他们的Fibonacci程序版本

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

5 个答案:

答案 0 :(得分:2)

您无法通过分配给不存在的索引在Python列表中创建 new 元素。您的列表为空,因此索引01 不存在

改为使用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,因为您已经拥有01的值。 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行轻松解决。

答案 1 :(得分:0)

您的代码存在一些问题:

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
  1. 第一次迭代这将是F[0] = F[-1] + F[-2],这在Python中很好地定义,但不是你想要的。您可能想要查看Python的索引方案。

  2. F[n]指的是第n + 1个元素,因为Python是0索引的。范围是[lower,upper],因此在最后一次迭代中实际上没有i = n

  3. 正如Martijn在下面评论的那样,第三个问题是你不能简单地索引到一个空列表。您必须执行连续追加,或将整个列表分配为F = [0]*n

答案 2 :(得分:0)

这是因为当程序到达F[0]时,它会尝试评估F的第0个索引中的内容。问题是F最初是一个空列表,因此没有第0个索引。您希望使用F.append(0)F.append(1)附加这些元素。

答案 3 :(得分:0)

您必须将值附加到列表中,因为它的大小为0.当您在下一个索引处添加项时,Python列表不会自动增长,您必须指定它,例如使用append函数< / p>

F = []
F.append(0)
F.append(1)
# [0, 1]

# OR
F = [0, 1]
# [0, 1]

答案 4 :(得分:-4)

你需要在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)