- 本記事はProjectEulerの「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。
問題 2: 偶数のフィボナッチ数
原文 Problem 2: Even Fibonacci numbers
**問題の要約:$4 \times 10^6$以下の偶数のフィボナッチ数の合計を求めよ
素直にインプリすると以下のようになります。数列を見ると偶数は3個置きに現れるので、間の2個をスキップするようなインプリも考えられますが、まずはシンプルなコードということで。
f = f1 = f2 = 1
esum = 0
while f < 4*10**6:
if (f % 2) == 0:
esum += f
f = f1+f2
f2 = f1
f1 = f
print(f"Answer: {esum}")
# Answer: 4613732
ただフィボナッチ数は今後も度々登場するのでpythonのyieldを使ってフィボナッチ数のgeneratorを作りました。引数に上限を指定するとfor分のiteratorとして使えます。リストの内包表記を使うとかなり短く書くことが出来ました。
# Fibonacci number generator
def fibgen(bound=0):
f = f1 = f2 = 1
yield f
while bound == 0 or f <= bound:
yield f
f = f1+f2
f2 = f1
f1 = f
fib = fibgen(4*10**6)
print(f"Answer: {sum([i for i in fib if i%2==0])}")
# Answer: 4613732
(開発環境: Google Colab)