我正在尝试将所有偶数斐波那契数加起来不超过4000000。我已经成功输出了所有斐波那契数不超过4000000,但是添加所有偶数对我来说是个问题。到目前为止,这是我尝试过的:
fibonacci = [1, 2]
i = 0
while fibonacci[-1] < 4000000:
fib = fibonacci[-1] + fibonacci[-2]
fibonacci.append(fib)
i += 1
del fibonacci[-1]
result = 0
for x in fibonacci:
if fibonacci[x] % 2 == 0:
result += fibonacci[x]
print(result)
它输出一个错误:
IndexError:列表索引超出范围
答案 0 :(得分:3)
在行中:
for x in fibonacci:
if fibonacci[x] % 2 == 0:
result += fibonacci[x]
x
实际上是斐波那契数本身,而不是索引,并且保证位于fibonacci
列表的范围之外。如果代码为for x in range(len(fibonacci)):
,则索引将为x
。
将其更改为:
for x in fibonacci:
if x % 2 == 0:
result += x
或更妙的是,使用列表理解:
result = sum(x for x in fibonacci if x % 2 == 0)
print(result)
此外,您可以在生成斐波那契数时在现场累积总和,而不是构建整个列表,这样可以大大提高内存效率:
def even_fib_sum(n):
total = 0
a = 0
b = 1
while a < n:
if a % 2 == 0:
total += a
a, b = a + b, a
return total
if __name__ == "__main__":
print(even_fib_sum(55))
或者更好的是,您可以使用生成器并放下even
,因为fib
更可重用:
def fib(n):
a = 0
b = 1
while a < n:
yield a
a, b = a + b, a
if __name__ == "__main__":
print(sum(x for x in fib(4000000) if x % 2 == 0))
请注意,斐波那契数列通常以0、1、1、2、3、5 ...开头,而不是1、2、3、5 ...,但您可以根据需要进行调整,以及是否要迭代是否包含n
。
答案 1 :(得分:0)
以前的答案的小汇编
fibonacci = [0, 1]
while fibonacci[-1] + fibonacci[-2] < 4000000:
fibonacci.append(fibonacci[-1] + fibonacci[-2])
print(sum(x for x in fibonacci if x % 2 == 0))
答案 2 :(得分:0)
这就是我初学者写作的方式。
#By considering the terms in the Fibonacci sequence whose values do
#not exceed four million,
#find the sum of the even-valued terms.
cache = {}
def fib(n):
if n < 3:
return 1
elif n in cache:
return cache[n]
else:
value = fib(n - 1) + fib(n - 2)
cache[n] = value
return value
tot = 0
for n in range(1, 34):
if fib(n) % 2 == 0:
tot += fib(n)
print(n, ':', fib(n))
print(tot)