[英]Sum of Even Fibonacci Numbers < X
我正在研究這個,我似乎有一個有效的解決方案,但我很難理解它的行為。
這就是我所擁有的。
#!/usr/bin/python
def even_fib_sums(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
if not number % 2:
total += number
yield total
print sum(even_fib_sums(4000000))
我是編程新手,但考慮到我需要遍歷范圍內的所有4000000數字,這對我來說是不合理的。
如果我使用相同的方法生成最多5的Fibonacci序列,如下所示,您將看到下面的結果。
def generate_fib(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
print number
generate_fib(5)
結果:1,2,3,5,8
在結果中的這些數字中,只有2和8%2 == 0.總和應該是10,但如果我要使用上面的第一個片段,我將返回12。 為什么這樣?
通過考慮Fibonacci序列中的值不超過四百萬的項,找到偶數項的總和。
你只需要循環直到你擊中大於400000的纖維而不是你的代碼試圖做的第4百萬個斐波納契數,你可以簡化為使用生成函數和總和,只產生偶數並在你擊中時打破循環斐波那契數> 4000000:
def fib(n):
a, b = 0, 1
while a <= n:
a, b = b, a + b
if not b & 1:
yield b
print(sum(fib(4000000)))
計算需要幾分之一秒:
In [5]: timeit sum(fib(4000000))
100000 loops, best of 3: 6 µs per loop
嘗試timeit even_fib_sums(4000000)
在幾分鍾后仍在運行。
通過使用for counter in range(0, limit)
您在函數中具有“限制”迭代。 例如,如果你的'limit'變量是10,你將不會得到甚至小於10的fibonachi數的總和,但你將得到前10個均勻的fibonachi數的總和。
為了使你的代碼正常工作,你需要重新計算for counter in range(0, limit)
到while last < limit
,並且每當你發現最后一個是偶數時,你將它添加到總數。
你可以稍微清理一下這個生成函數。 這是我寫它的方式。
def fib(x):
a = 1
b = 1
yield a
yield b
a,b = b,a+b
while b<=x:
yield b
a,b = b,a+b
這將為您提供一個生成函數,它將為您提供小於或等於x的所有斐波納契數(我們在這里應該更加小心,因為我們將返回前兩個數字,無論如何)。
然后我們就可以做到
sum(x for x in fib(4000000) if x%2==0)
你應該改變你的代碼只是產生數字,而不是總和,或者只是改變yield返回,並刪除sum()keyworkd,如下所示:
def even_fib_sums(limit):
number = 1
last = 0
before_last = 0
total = 0
for counter in range (0,limit):
before_last = last
last = number
number = before_last + last
if not number % 2:
total += number
return total
print even_fib_sums(5)
在第一個代碼段中,您總計了整數,而不是僅僅產生數字。 如果你希望在你的第一個片段中得到10,輸入為5,你應該用以下任何一種方法修改代碼(不要試圖在這里有效,只是為了解決問題):
...
number = before_last + last
if not number % 2:
yield number
print sum(even_fib_sums(4000000))
要么
...
number = before_last + last
if not number % 2:
total += number
return total
print even_fib_sums(4000000)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.