“Python”中的项目Euler#2

时间:2014-04-24 02:10:37

标签: python fibonacci

我是绝对的初学者。我在Python中尝试使用Project Euler。你能指出我的代码出错了吗?

Q)Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:

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

通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。

def fib(a):
if ((a==0) or (a==1)):
    return 1
else:
    return((fib(a-1))+(fib(a-2)))
r=0
sum=0
while (fib(r))<4000000:
if(((fib(r))%2)==0):
    sum+=fib(r)
print(sum)

9 个答案:

答案 0 :(得分:3)

您的代码不是错误,它太慢了。为了解决Project Euler问题,您的代码不仅必须正确,而且您的算法必须高效。

你的斐波那契计算是非常昂贵的 - 也就是说,递归地试图获得下一个斐波纳契数在O(2 ^ n)时间运行 - 当你想要总数限制为四百万时,这个时间太长了。

Python中更有效的实现如下:

x = 1
y = 1
z = 0
result = 0

while z < 4000000:
   z = (x+y)         
   if z%2 == 0:
       result = result + z

   #next iteration

   x = y
   y = z

print result

答案 1 :(得分:1)

这绝对不是唯一的方式 - 而是另一种方式。

def fib(number):
    series = [1,1]
    lastnum = (series[len(series)-1]+series[len(series)-2])
    _sum = 0
    while lastnum < number:
        if lastnum % 2 == 0:
            _sum += lastnum
        series.append(lastnum)
        lastnum = (series[len(series)-1] +series[len(series)-2])
    return series,_sum

答案 2 :(得分:1)

这可能是最有效的方法。

a, b = 1, 1
total = 0
while a <= 4000000:
    if a % 2 == 0:
        total += a
    a, b = b, a+b  
print (total)

答案 3 :(得分:0)

你应该使用生成器功能,这是要点:

def fib(max):

    a, b = 0, 1

    while a < max:

        yield a

        a,b = b, a+b

现在从shell调用此函数,或者在调用fib函数后写一个函数,你的问题就会得到解决。我花了7个月的时间来解决这个问题

答案 4 :(得分:0)

使用递归可能适用于较小的数字,但由于您测试的每个案例最多为4000000,因此您可能希望将已经找到的值存储到值中。您可以在现有答案中查找此算法。

另一种方法是使用Binet的公式。该公式将始终返回第n个Fibonacci数。您可以在MathWorld上了解详情。

请注意,偶数编号的Fibonacci数字出现在序列中的每三个元素上。您可以使用:

def binet(n):
     """ Gets the nth Fibonacci number using Binet's formula """
     return int((1/sqrt(5))*(pow(((1+sqrt(5))/2),n)-pow(((1-sqrt(5))/2),n)));

s = 0; # this is the sum
i = 3;
while binet(i)<=4000000:
    s += binet(i);
    i += 3; # increment by 3 gives only even-numbered values

print(s);

答案 5 :(得分:0)

您也可以尝试这个动态程序,对我来说工作得更快

dict = {}
def fib(x):
    if x in dict:
        return dict[x]
    if x==1:
        f = 1
    elif x==2:
        f = 2
    else:
        f = fib(x-1) + fib(x-2)
    dict[x]=f
    return f

i = 1
su = 0
fin = 1

while fin < 4000000:
    fin = fib(i)
    if fin%2 == 0:
        su += fib(i)
    i+=1

print (su)

答案 6 :(得分:0)

正如其他答案中所指出的,您的代码缺乏效率。有时,保持尽可能简单是良好计划的关键。这对我有用:

    x=0
    y=1
    nextterm=0
    ans=0
    while(nextterm<4000000):
        nextterm=x+y
        x=y
        y=nextterm
        if(nextterm%2==0):
            ans +=nextterm;
    print(ans)

希望这会有所帮助。干杯!

答案 7 :(得分:0)

它已经过优化并且可以正常工作

def fib(n):
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()
fib(10000)

答案 8 :(得分:0)

这是基于 Lutz Lehmann 对 this answer 的评论稍微更有效的算法(也适用于已接受的答案):

def even_fibonacci_sum(cutoff=4e6):
    first_even, second_even = 2, 8
    even_sum = first_even + second_even
    while even_sum < cutoff:
        even_fib = ((4 * second_even) + first_even)
        even_sum += even_fib
        first_even, second_even = second_even, even_fib
    return even_sum

考虑以下斐波那契数列:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, ...

斐波那契数列中的每三个元素都是偶数。

所以上面序列中的偶数是 2, 8, 34, 144, 610, ...

对于偶数n,以下等式成立:

n = 4 * (n-1) + (n-2)

示例:

  • 34 = (4 * 8) + 2, 第三个​​偶数 = (4 * 第二个偶数) + 第一个甚至
  • 144 = (4 * 34) + 8,第四个偶数 = (4 * 第三个​​偶数) + 第二个甚至
  • 610 = (4 * 144) + 34 第五个偶数 = (4 * 第四个偶数) + 第三个​​偶数