簡體   English   中英

偶數Fibonacci數的總和<X

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM