kostumブログ

勉強したことやノート代わりのアウトプットに使っています。

project Euler 002

環境

問題

 フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.

 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

 数列の項の値が400万以下のとき, 値が偶数の項の総和を求めよ.

考え方

  1. 3 ~ 400 万までの数字を作る
  2. 1 と 2 が格納された配列が必要
  3. 2 つの項を作る
    1. 前の項 + 現在の項 = 次の項 を作る
    2. 次の項を配列に格納
    3. 前の項を現在の項に更新
    4. 現在の項を次の項に更新
  4. 3 を現在の項が400万以下まで繰り返す
  5. 配列の中から偶数の項だけを取り出した配列を作る
  6. 5 の項を総和を計算する

コード

  const question002 = () => {
  const list: number[] = [1, 2];
  let preNumber = 2;
  let currentNumber = 3;
  while (currentNumber <= 4000000) {
    let nextNumber = currentNumber + preNumber;
    list.push(nextNumber);
    preNumber = currentNumber;
    currentNumber = nextNumber;
  }
  return list .filter(num => {
    if (num % 2 === 0) {
      return num;
    }
  }).reduce((sum, num) => {
      return sum + num;
    });
  };

説明

  • まず、フィボナッチ数列を格納する配列を作る。ただ、1 と 2 は先に格納しておく。
  • 前の項、現在の項を作成しておく。
  • 現在の項が 400 万以下の間は繰り返しを続ける。
  • その条件下で、前の項と現在の項を足して次の項を作成する。
  • 次の項をフィボナッチ数列を格納する配列に格納する。
  • 前の項と現在の項を次の繰り返しのために、更新する。
  • フィボナッチ数列を計算し終わったら、その配列の各要素を一つずつ取り出し、偶数である場合の要素を新しい配列に格納する。
  • そして、その配列の要素を合計する。