Python問題集を解いてみよう!!

【Python問題集】No.4 フィボナッチ数列の偶数かつ1000未満の項の和を求める

URLをコピーする
URLをコピーしました!
目次

問題

フィボナッチ数列の項のうち、

  • 偶数 かつ 1000未満の項

を全て足した値を求め、表示させよ。

おすすめのレンタルサーバー

解答

解答を見る前に、一度ご自身で考え、コードを書いてみることをオススメします。

解説

この問題のポイントは次の2点です。

  • フィボナッチ数列を求める
  • 偶数の場合、加算する

順番に見ていきます。

フィボナッチ数列を求める

この問題はフィボナッチ数列を知らないと詰んでしまいます。

フィボナッチ数列とは、次のような漸化式で定義される数列のことです。

フィボナッチ数列 漸化式

0、1、で始まり、その次は0と1を足した1、その次は1と1を足した2、、、というように、前の2つの項の和が次の項の値になる数列がフィボナッチ数列と呼ばれています。

0、1、1、2、3、5、8、、、

こんな感じで永遠と続きます。

フィボナッチ数列のような単純な漸化式で定義される数列はプログラムでは簡単に求めることができます。

いくつか書き方はあると思いますが、解答例で使用しているwhile文と、もう1つfor文を使って求めてみます。

while文を使ってフィボナッチ数列を求める

while文は、繰り返す回数が事前に分からない場合によく使われます。

今回の問題がまさにそれで、「1000未満」のフィボナッチ数列を求めたいけど、いくつかあるのか分からない、そんな時はwhile文が適しています。

while文を使って10000未満のフィボナッチ数列を求めてみます。

# 始まりの2項は0、1と決まっているので、リストに予め格納しておきます。
fibonacci = [0, 1]

# 新しく求める項を保持する変数
value = 0 

# 新しく求める項の位置を保持するする変数(最初は3番目の項を求めるので2を入れておきます。)
n = 2

# 本来は「while」の後にループを続ける条件を書きますが、
# 処理した後でループを抜けるか判定させたいため、
# 「True」としています。
# この場合、break文が必須です。
while True: 
    value = fibonacci[n-2] + fibonacci[n-1]

    if value >= 10000:
        break

    fibonacci.append(value)
    n += 1

print('10000未満のフィボナッチ数列 : ',fibonacci)

上記の実行結果

10000未満のフィボナッチ数列 :  [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]

for文を使ってフィボナッチ数列を求める

次はfor文です。

for文は繰り返す回数が事前に決まっている場合に使用されることが多いです。

フィボナッチ数列の最初の10個(先頭の0、1を含む)の値をfor文を使って求めてみます。

# 始まりの2項は0、1と決まっているので、リストに予め格納しておきます。
fibonacci = [0, 1]

for i in range(2,10):
    # range(2,10)とすると i には2〜9が順番に入ります
    fibonacci.append(fibonacci[i-2] + fibonacci[i-1])

print('フィボナッチ数列の先頭10個 : ',fibonacci)

上記の実行結果

フィボナッチ数列の先頭10個 :  [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

偶数の場合、加算する

偶数の判定は問題集No.1でも取り扱いました。

2で割った余りが0であれば偶数と判定します。

Colab

解答例や解説のコードは Google Colaboratory で確認しています。

環境構築の不要な Google が提供している Webサービスなので、Python を学習中の方にはオススメです。

おわりに

今回の問題は LINE のオープンチャットに投稿されたものです。

今後も具体的な問題・課題の解説記事を増やしていきたいと思っています。

解説して欲しい問題・課題がありましたら、お問い合わせフォームからご連絡ください。

以上です。

スポンサーリンク

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
URLをコピーする
URLをコピーしました!

コメント

コメントする

目次
閉じる