我试图做斐波那契数列,但不是用第2个过去的数字做第三个数字,而是想用最后3个数字做第四个数字 我的第一个代码是:
def tribonacci(signature, n):
a, b, c = signature
tribo = [signature[0],signature[1],signature[2]]
for i in range(n):
s = a+b+c
a = b
b = c
c = s
tribo.append(c)
return tribo
print(tribonacci([1, 1, 1], 10))
我收到[1、1、1、3、5、9、17、31、57、105、193、355、653],这意味着该序列以数字3开头,而不是以第一个1开头。我不想将“签名”值附加到数组,而是开始将每个值添加到数组
所以我尝试了以下代码:
def tribonacci(signature, n):
tribo = []
for i in range(0, n):
a = signature[i]
b = signature[2*i]
c = signature[3*i]
s = a+b+b
a = b
b = c
c = s
tribo.append(c)
return tribo
print(tribonacci([1, 1, 1], 10))
我原本希望得到此值[1、1、1、3、5、9、17、31、57、105],但是出现错误索引超出范围
答案 0 :(得分:1)
在第二个示例中,您要处理两个不同的列表:tribo
和signature
。当您增加i
的索引时,尝试从signature
中获取该索引-但是signature
仅包含三个元素,因此当i*3 > 2
时,您得到一个{{1 }}。
解决这个问题的更好方法是使用原始代码,而不是制作两个不同的数组,然后从返回的数组中切出前三个元素:
IndexError
您不必使用三个不同的变量来存储这三个元素,还可以利用python的负列表包含量(从后数而不是从前数)的想法。为此,def tribonacci(signature, n):
a, b, c = signature
...
return tribo[3:]
的更简洁的实现可能是这样的:
tribonacci
尽管如果给定的def tribonacci(signature, n):
tribo = signature[:] # copy the contents of signature, to start with
for i in range(n):
# add the last three elements of tribo together, and append the sum
tribo.append(
tribo[-1] + tribo[-2] + tribo[-3]
)
return tribo[3:]
少于3个元素,这将为您提供IndexError
。
答案 1 :(得分:1)
我相信错误在于调用数组:
for i in range(0, n):
a = signature[i]
b = signature[2*i]
c = signature[3*i]
...应该是...
for i in range(0, n):
a = signature[i]
b = signature[1+i]
c = signature[2+i]
否则,当n = 10时,您将访问签名(30),该签名不存在。
也存在其他错误,例如s=a+b+b
而不是s=a+b+c
,仅此编辑不能解决问题,但是这很可能就是您收到超出范围的错误的原因。
否则,最大的错误是使用两个不同的数组。您的tribo
数组永远不会以开头的1初始化,因此无法成为所需的结果。尝试保留您的核心代码,我只需将for循环的范围更改为(0, n-3)
或使用signature
代替tribo。
def tribonacci(signature, n):
for i in range(0, n-3):
a = signature[i]
b = signature[1+i]
c = signature[2+i]
s = a+b+c
a = b
b = c
c = s
signature.append(c)
return signature
print(tribonacci([1, 1, 1], 10))