Python 为什么接收到索引超出范围错误?
我试着做斐波那契数列,但不是用过去的2个数做第三个数,而是用最后的3个数做第四个数 我的第一个代码是:Python 为什么接收到索引超出范围错误?,python,Python,我试着做斐波那契数列,但不是用过去的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
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],但是错误索引超出范围出现在第二个示例中,您处理的是两个不同的列表:
tribo
和签名
。当您增加i
的索引时,您尝试从签名
获取该索引,但是签名
只有三个元素,因此当i*3>2
时,您会得到一个索引器
解决此问题的更好方法不是创建两个不同的数组,而是使用原始代码,然后从返回的数组中切掉前三个元素:
def tribonacci(signature, n):
a, b, c = signature
...
return tribo[3:]
您不必使用三个不同的变量来存储这三个元素,还可以利用python的负列表incides思想(从后面而不是从前面开始计数)。这样做的tribonaci
的更简洁实现可能如下所示:
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个元素,这将为您提供一个索引器。在第二个示例中,您处理的是两个不同的列表:tribo
和签名
。当您增加i
的索引时,您尝试从签名
获取该索引,但是签名
只有三个元素,因此当i*3>2
时,您会得到一个索引器
解决此问题的更好方法不是创建两个不同的数组,而是使用原始代码,然后从返回的数组中切掉前三个元素:
def tribonacci(signature, n):
a, b, c = signature
...
return tribo[3:]
您不必使用三个不同的变量来存储这三个元素,还可以利用python的负列表incides思想(从后面而不是从前面开始计数)。这样做的tribonaci
的更简洁实现可能如下所示:
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个元素,这将为您提供一个索引器。我认为错误在于调用数组:
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)
,或者使用签名来代替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))
我认为错误在于调用数组:
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)
,或者使用签名来代替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))
在第二个代码中,您尝试在各种索引中访问签名。但实际上您从未更改该列表,因此它始终保持[1,1,1]
(这意味着在索引>2处的任何访问都将失败)。在第二个代码中,您尝试在不同索引处访问签名。但实际上您从未更改该列表,因此它始终保持[1,1,1]
(这意味着在索引>2处的任何访问都将失败)。此解决方案(放置的最后一块代码)的问题在于它修改了签名
,而OP可能不希望这样做。这可以通过在函数开始时通过signature=signature[:]
简单地复制signature
来解决(尽管这有点黑客行为)@greencloffguy确实,根据所需的行为,有很多解决方案,直到OP。我假设一旦他发现索引OOB错误,很可能是由于签名[2*I]引起的,他会在以后随心所欲地继续使用它。这个解决方案的问题(您放置的最后一块代码)是它修改了签名
,而OP可能不希望这样。这可以通过在函数开始时通过signature=signature[:]
简单地复制signature
来解决(尽管这有点黑客行为)@greencloffguy确实,根据所需的行为,有很多解决方案,直到OP。我假设,一旦他发现索引OOB错误,很可能是由于签名[2*I]引起的,他会在以后随心所欲地继续使用它。