我是绝对的初学者。我在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)
答案 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)
示例: