2011-12-24 76 views
4

我解決a Project Euler problem是去如下的「而」循環中產生的某些值:我如何可以添加使用Python

通過考慮其值不超過4萬元斐波納契數列的條款,發現即使值項之和」

所以我用這個腳本打印Fibonacci序列多達四​​百萬:

a = 0 
b = 1 
while b < 4000000: 
    print b 
    a, b = b, a+b 

顯然,我可以運行這個,只需手動添加偶數值,但我會覺得我在作弊。

從技術上講,我想我問兩個問題:

  1. 我怎麼能挑出來的脣上?
  2. 我怎樣才能添加這些均勻而不實際分配給他們的變量?

噢,我相信它是非常明顯的,但我很新......呃,編程一般而言,我可以很容易地迷失在專家的冗長之中。提前致謝!

回答

1

我怎麼能挑出來的脣上?

偶數是當您將它們除以2(整數)時剩下的零。在Python中,我們用%運算符得到「除以整數後的餘數」。

但是,這裏還有另一個巧妙的技巧。即使斐波納契數字是序列中的第三個數字,如果您可以嚴格證明原因,那麼您將接近獲得直接生成甚至斐波那契數列序列所需的公式。

我怎麼能添加這些均勻而沒有實際分配給他們的變量?

將它們分配給變量有什麼問題?只需設置另一個運行計數。

+0

我沒有弄清楚你所說的詭計,但你的答案很簡單。這讓我找到了一條替代路線。我只是添加了一個簡短的'if'語句來添加偶數值。謝謝! – Grant 2011-12-24 22:45:11

+0

我其實不太確定我對這個技巧的斷言。 > _ < – 2011-12-24 23:07:51

2

啊,項目歐拉!

雖然這是一個比編程問題更多的數學問題。

在編程方面,只需添加一個累加器即可。您可以使用模運算符%來測試均勻性,該運算符在將左操作數除以右操作數後返回整數餘數。

a, b = 0, 1 
evens = 0 
while b < 4000000: 
    if not b%2: 
     evens += b 
    a, b = b, a+b 

一旦你找到了答案,該項目歐拉PDF和論壇將填補你在這個問題上的mathy一部分,真正回答你的問題。有幾種方法可以避免計算每個斐波納契數,並且必須測試均勻性,但這些都需要利用斐波那契數列的特定數學屬性。

6

如果你不願意變量賦值,你可以享受一個functional approach

>>> from itertools import takewhile, ifilter 

>>> def fib(): 
     a, b = 0, 1 
     while True: 
      yield a 
      a, b = b, a+b 

>>> def is_even(x): 
     return x % 2 == 0 

>>> sum(ifilter(is_even, (takewhile(lambda x: x<4000000, fib())))) 
4613732 
+0

使用'return not(x%2)'而不是'return x%2 == 0':它更pythonic更快。 – gecco 2011-12-24 09:17:00

+2

@gecco'return not(x%2)'利用了0被視爲'False'並使得條件隱含的事實。我不明白這怎麼可能被認爲是更pythonic。我懷疑它會對CPython以外的其他實現產生影響。 – DasIch 2011-12-24 20:07:04

相關問題