偶数斐波纳契数的总和需要时间

时间:2019-06-01 04:54:04

标签: python

所以,我正在写这篇文章来解决这个问题。

斐波那契数列中的每个新术语都是通过将前两个术语相加而生成的。从1和2开始,前10个术语将是:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

通过考虑斐波那契数列中值不超过400万的项,找到偶值项的总和。

这是我的代码。

这需要花很长时间才能计算,即使在十五分钟之内也没有给出答案,我如何有效地计算呢?

1 个答案:

答案 0 :(得分:0)

让我们一步一步地分解它。显然,斐波那契数列有一个偶数夹在2个不同的奇数之间。

考虑序列的前几个元素。

1, 2 ,3、5, 8

在这种情况下,让我们关注前两个数字(1, 2)和后两个数字(5, 8)。这里的5、8可以写为((1+2)*1+2, (1+2)*2+2)

如果op是两个连续的斐波那契数列,则进行归纳;这样p是偶数。令O+PS。那么接下来的两个连续数字,使得第二个数字为偶数(S+P, 2S+P)

利用这些知识,我们可以编写一个简单的函数

def return_next_fib_pair(odd_num, even_num):
    sum_in_consideration = odd_num + even_num
    return(sum_in_consideration + even_num, sum_in_consideration*2 + even_num)

现在调用函数,直到(sum_in_consideration*2 + even_num)小于400万。 在此之前,添加所有值(sum_in_consideration*2 + even_num)

输出它们的总和!

实际代码:

def return_next_fib_pair(odd_num, even_num):
    sum_in_consideration = odd_num + even_num
    return(sum_in_consideration + even_num, 
    sum_in_consideration*2 + even_num)


fib_1 = 1
fib_2 = 2 
sum_of_even_fib = 0 
target_fibonnaci_ceiling = 1000

while(fib_2 < target_fibonnaci_ceiling):
    sum_of_even_fib = sum_of_even_fib + fib_2
    fib_1, fib_2 = return_next_fib_pair(fib_1, fib_2)

print("The sum of all even fibonacci numbers upto", 
    target_fibonnaci_ceiling, "is:", sum_of_even_fib)

但是,最快的方法不是上述方法。具有O(1)复杂度的最快方法如下:

Fib(n)= [{(√5+ 1)/ 2} ^ n] /√5

其中Fib(n)是第n个斐波那契数。

进一步使斐波那契数为偶数,n必须是三的倍数。

因此,解决您的问题的方法是找到

ΣRound(Fib(n)) where (n%3 ==0) && (n < 4000000)