无法防止斐波那契 'for' 循环迭代中的 'list index out of range' 错误
Unable to prevent 'list index out of range' error in fibonacci 'for' loop iteration
我仍然是 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
虽然保留了这个结构,但我没有找到克服 'list index out of range' 错误的方法。我认为因为当 i = 0 时 listy[i-1] 会超出范围,但是如果函数在循环中线性进行,那么 else 语句应该只在 i = 2 时生效。任何人都可以看到我在做什么错了?
谢谢!
因此,要找出问题的根源,我们需要退后一步,看看您的循环在做什么。
最初,您的 for 循环从 0 计数到任何长度,让我们看看 i 的值会是什么样子:
0
1个
2个
...
所以从2开始,因为定义了0,1的行为:
listy.append(listy[2]+listy[1])
请记住,listy 现在有 2 个项目,零索引,换句话说,项目是 1 和 0,因此项目 listy[2] 不存在。
因此,您的代码应该是
listy.append(listy[i-2]+listy[i-1])
总的来说这不是一个好的解决方案,但一个小错误是您应该将第 9 行更改为:
listy.append(listy[i - 1] + listy[i - 2])
此外,您将拥有一个“长度 + 1”尺寸列表,而不是“长度”。
您使用的列表索引有误
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] returns 列表的最后一个元素。
列表位置初始化为 0 而不是 1。
当 i = 2 时,在你的 else 语句中
listy.append(listy[i]+listy[i-1]) 等同于 listy.append(listy[2]+listy[1])
然而,第二个循环后的列表等于 [1,1]。
最大位置为 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]
我仍然是 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
虽然保留了这个结构,但我没有找到克服 'list index out of range' 错误的方法。我认为因为当 i = 0 时 listy[i-1] 会超出范围,但是如果函数在循环中线性进行,那么 else 语句应该只在 i = 2 时生效。任何人都可以看到我在做什么错了?
谢谢!
因此,要找出问题的根源,我们需要退后一步,看看您的循环在做什么。
最初,您的 for 循环从 0 计数到任何长度,让我们看看 i 的值会是什么样子:
0 1个 2个 ...
所以从2开始,因为定义了0,1的行为:
listy.append(listy[2]+listy[1])
请记住,listy 现在有 2 个项目,零索引,换句话说,项目是 1 和 0,因此项目 listy[2] 不存在。
因此,您的代码应该是
listy.append(listy[i-2]+listy[i-1])
总的来说这不是一个好的解决方案,但一个小错误是您应该将第 9 行更改为:
listy.append(listy[i - 1] + listy[i - 2])
此外,您将拥有一个“长度 + 1”尺寸列表,而不是“长度”。
您使用的列表索引有误
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] returns 列表的最后一个元素。
列表位置初始化为 0 而不是 1。
当 i = 2 时,在你的 else 语句中 listy.append(listy[i]+listy[i-1]) 等同于 listy.append(listy[2]+listy[1])
然而,第二个循环后的列表等于 [1,1]。
最大位置为 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]