无法防止斐波那契'for'循环迭代中的'list index out of range'错误



我仍然是Python的初学者,我试图优化一个函数来生成指定数量的斐波那契数列。这是我写的代码:

def attempt2(length):
listy=[]
for i in range(0,length+1):
if i == 0:
listy.append(1)
elif i == 1:
listy.append(1)
else:
listy.append(listy[i]+listy[i-1])
return listy

在保持这个结构的同时,我没有办法克服"列表索引超出范围"的错误。我认为,因为列表[I -1]将超出范围,当I = 0时,但如果函数通过循环线性进展,那么else语句应该只在I = 2时生效。有人能看出我哪里做错了吗?

谢谢!

所以,为了找出问题的根源,我们需要退后一步,看看你的循环在做什么。

一开始,你的for循环从0开始计数,不管长度是多少,让我们看看i的值是什么样的:

012…

所以从2开始,因为定义了0,1的行为:

listy.append(listy[2]+listy[1])

请记住,列表现在有2项,它们是零索引,换句话说,项目是1和0,因此项目列表[2]不存在。

因此,你的代码应该是
listy.append(listy[i-2]+listy[i-1])

这不是一个好的解决方案,但一个小错误是您应该将第9行更改为:

listy.append(listy[i - 1] + listy[i - 2])

你也会有一个' length + 1 '的大小列表,而不是' length '。

您使用了错误的列表索引

def attempt2(length):
listy=[]
for i in range(0,length):
if i == 0:
listy.append(1)
elif i == 1:
listy.append(1)
else:
listy.append(listy[i -1]+listy[i - 2])
return listy
print(attempt2(12))
#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

Listy[-1]返回列表的最后一个元素。
列表位置初始化为0而不是1。
当i = 2时,在else语句中listy.append(listy[i]+listy[i-1])相当于listy.append(listy[2]+listy[1])
然而,第二次循环后的列表等于[1,1]。
最大pos值为1,2超出范围
def loop_fib(n):
# first two numbers are 1
fib_1=1
fib_2=1
res=[1,1]
# n is inclusive
for i in range(3,n+1):
# new fib_2=fib_1+fib_2
# new fib_1=old fib_2
fib_1,fib_2=fib_2,fib_1+fib_2
res.append(fib_2)
return res

loop_fib(10)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

最新更新