计算斐波纳契数列中偶数项的总和小于4百万

时间:2014-10-16 04:48:37

标签: python

我在这里得到正确答案: 总和 - 4613732 时间-0.0

import time

def factorial():
        i=1
        j=2
        fac=[]
        final_list=[]
        fac.append(i)
        fac.append(j)
        z=i+j
        while(z<4000000):
                z=i+j
                fac.append(z)
                i=j
                j=z
        for n in fac:
                if(n%2==0):
                        final_list.append(n)
        return sum(final_list)

if __name__ == "__main__":
        start = time.clock()
        print "Sum is"+ " " + str(factorial())
        print "Time taken"
        print time.clock() - start

只想了解一下我是如何在python中编写逻辑的。是好还是可以做得更好(w.r.t编码标准等)?

1 个答案:

答案 0 :(得分:0)

这是一个非常巧妙的技巧。

这是斐波那契数字:

F_1 : 1
F_2 : 1
F_3 : 2
F_4 : 3
F_5 : 5
F_6 : 8
F_7 : 13
F_8 : 21
F_9 : 34
  • 序列是(奇数,奇数,偶数)重复。

  • 偶数是两个奇数的总和

  • 因此(奇数和偶数之和)=(奇数之和)+(偶数之和)= 2 *(奇数之和)。 只要我们总结到一个偶数值的值。

即。

1 + 1 + 2 + 3 + 5 + 8 + 13 + 21 + 34 = 
1 + 1 + (1+1) + 3 + 5 + (3+5) + 13 +21 + (13 + 21) = 
2 * (1 + 1 + 3 + 5 + 13 + 21 )

现在,前N个斐波那契数的总和是第N + 2个斐波纳契数 - 1

继续我们的序列,我们得到34,55,89,......

所以

1 + 1 + 2 + 3 + 5 + 8 + 13 + 21 + 34 = 89 - 1

等等

1 + 1 + 3 + 5 + 13 + 21 = (89 - 1)/2 = 44.

这引出了以下算法:

  1. 查找NF_NF_N <= MF_{N+1} > M。为此,我们使用维基百科Explicit fibonacci inversion formula
  2. 中的公式
  3. 如果F_N是偶数,我们的结果只是(F_{N+2}-1)/2,请注意F_{N+2}可以在O(log(N))时间内计算。
  4. 如果F_N奇怪,我们退后一步,直到我们找到一个偶数,(一步或两步)。
    • 如果是一步,那么我们的结果是(F_{N+1}-1)/2 + F_N
    • 如果是两个,我们的结果是(F_N-1)/2 + F_{N-1} + F_N
  5. 所有这些步骤都可以在log(N)时间内完成。