我用来尝试解决这个问题的方法很有效,但我认为它非常有效,因为只要我输入一个太大的数字,它就不会工作。
def fib_even(n):
fib_even = []
a, b = 0, 1
for i in range(0,n):
c = a+b
if c%2 == 0:
fib_even.append(c)
a, b = b, a+b
return fib_even
def sum_fib_even(n):
fib_evens = fib_even(n)
s = 0
for i in fib_evens:
s = s+i
return s
n = 4000000
answer = sum_fib_even(n)
print answer
例如,这不适用于4000000,但适用于400.是否有更有效的方法?
答案 0 :(得分:3)
没有必要计算所有斐波纳契数。
注意:我使用的是斐波那契序列的更标准的初始值F [0] = 0,F [1] = 1。项目Euler#2以F [2] = 1开始其序列,F [3] = 2,F [4] = 3,....对于这个问题,两种选择的结果都相同。
递归方程
F[n+1] = F[n] + F[n-1]
也可以读作
F[n-1] = F[n+1] - F[n]
或
F[n] = F[n+2] - F[n+1]
将n从1总和加到N(记住F [0] = 0,F [1] = 1)在左边给出斐波那契数的总和,在右边给出一个伸缩总和,其中所有的内部条款取消
sum(n=1 to N) F[n] = (F[3]-F[2]) + (F[4]-F[3]) + (F[5]-F[4])
+ ... + (F[N+2]-F[N+1])
= F[N+2] - F[2]
因此,对于使用数字N = 4,000,000的总和来说,只需计算
F[4,000,002] - 1
用一种计算单个Fibonacci数的超快方法。减半和平方,相当于迭代矩阵的取幂,或基于黄金比率的指数公式(以必要的精度计算)。
由于大约每20个斐波那契数字你获得4个额外的数字,最终结果将包括大约800000个数字。更好地使用可以包含所有数据类型的数据类型。
只检查前10或20个斐波那契数字就会发现所有偶数成员的指数均为3 * k。通过减去两次连续的递归来检查
F[n+3]=2*F[n+2]-F[n]
所以F [n + 3]总是与F [n]具有相同的奇偶性。投入更多计算可以发现成员三个指数的递归分开为
F[n+3] = 4*F[n] + F[n-3]
设置
S = sum(k=1 to K) F[3*k]
将n = 3 * k上的递归求和
F[3*K+3]+S-F[3] = 4*S + (-F[3*K]+S+F[0])
或
4*S = (F[3*K]+F[3*K]) - (F[3]+F[0]) = 2*F[3*K+2]-2*F[2]
因此所需的总和具有公式
S = (F[3*K+2]-1)/2
使用黄金配给公式的快速计算揭示了N应该是什么,以便F [N]正好在边界之下,因此K = N div 3应该是,
N = Floor( log( sqrt(5)*Max )/log( 0.5*(1+sqrt(5)) ) )
在原始问题中,人们发现N = 33,因此总和是
S = (F[35]-1)/2;
在问题中采用错误表示的问题,N = 4,000,000,因此K = 1,333,333,总和
(F[1,333,335]-1)/2
仍然有大约533,400位数字。是的,biginteger类型可以处理这些数字,只需要时间来计算它们。
如果以60行80个数字的格式打印,这个数字可以填充112张纸,只是为了了解输出的样子。
答案 1 :(得分:0)
没有必要存储所有中间Fibonacci数字,也许存储会导致性能问题。