#problem2
学校でも勉強が進み、個人的にも少し勉強をしたので、今回は自分でコードを書いてみたいと思います。
##問題文
フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
という問題です。
最初の2項が 1 , 1 で始まらないんですね...
フィボナッチ数列とは何ぞや? という方は こちらへ
##方針
フィボナッチの偶奇を判定していけばいいんですね! (そのまんまやんけ...)
a = b っていう文と、 b = a + b という文が出てきそうですね
とりあえず書いてみましょう。
##間違った解答&解説
a = 1
b = 2
result = 0
while b < 4*10**6:
if b%2 == 0:
result += b
a = b
b = a + b
print(result)
4194302
あれ?答えが違う... (ちなみに答えは 4613732 です)
間違い探しをする前に初登場の関数の紹介です!
**ここを押すと while文 の説明がでるよ!**
whileとは... while文は繰り返し実行をための文です。こんな書き方をします。 **while 繰り返しの条件:** 実際のコードで書くとn = 0
while n < 5:
print(n)
n += 1
0
1
2
3
4
ここから解説です。
前回もやった通り 1、2、3行目 で関数の宣言と代入を行っています。
4~8行目 で繰り返しの処理を行っています。
5行目 で偶数の判定、
6行目で result に偶数を合計していています。
7、8行目で肝心のフィボナッチ数列を作っているのですが、どうやらここに問題があるらしい...
初期の予定では
(a, b) = (1, 2) (2, 1+2) (3, 2+3) (5, 3+5) ...となる予定でしたが、実行してみると
(a, b) = (1, 2) (2, 2+2) (4, 4+4) (8, 8+8) ...と、上がっていってしまいました...
これは a = b を行った後に b = a + b を行っていため
b = b + b をしているのとおんなじなんですね。(´・ω・`)
どうにかしてこの処理が b = a + b として成り立たせることができればよさそうです。
##解答&解説
a, b = 1, 2
result = 0
while b < 4*10**6:
if b%2 == 0:
result += b
a, b = b, a + b
print(result)
4613732
ヤタ━─━─ヽ(´Д`)ノ─━─━!!!!
同時に変数の宣言と代入ができるのではないかとおもって直感で書いたらいけました! 正規の方法ですのでご安心を(笑)
しっかり a = b と b = a + b が行われていますね。
他の分は書き換えてないです。
##終わり
while文の使い方と代入の面白さが伝わっていれば幸いです!