JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】指定した上限以下の偶数フィボナッチ数の合計を求める方法

本記事では、数値(上限値)を引数として受け取り、その上限未満にあるフィボナッチ数の中から偶数のみを抽出し、それらの合計を計算して返すJavaScript関数の実装方法を解説します。

問題の概要

関数には上限となる数値が渡されます。この関数は、フィボナッチ数列を順に生成しながら、上限を超えない範囲で偶数の項だけを足し合わせていきます。

具体例

たとえば、上限が 100 の場合を考えてみましょう。100 未満のフィボナッチ数は次の通りです。

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

このうち偶数である項は以下の3つです。

2, 8, 34

したがって、関数が返すべき出力は次のようになります。

2 + 8 + 34 = 44

実装コード

以下が実際のコードです。アロー関数としてシンプルに定義しています。

const sumOfEven = (limit) => {
    let temp, sum = 0, a = 0, b = 1;
    while (b < limit) {
        if (b % 2 === 0) {
            sum += b;
        };
        temp = a;
        a = b;
        b += temp;
    };
    return sum;
};
console.log(sumOfEven(100));
console.log(sumOfEven(10));
console.log(sumOfEven(1000));

コードの解説

このアルゴリズムのポイントは以下の通りです。

  • 変数の初期化: a = 0b = 1 を初期値として、フィボナッチ数列の先頭2項を表現します。sum は偶数項の合計を保持するための変数です。
  • ループ条件: while (b < limit) により、現在のフィボナッチ数が上限を超えた時点でループを終了します。
  • 偶数判定: b % 2 === 0 で現在の項が偶数かどうかを判定し、偶数であれば sum に加算します。
  • 数列の更新: 一時変数 temp を使って前の項を退避し、ab を1つずつ進めることで、次のフィボナッチ数を効率よく生成します。

この方法では配列を使わずに数列を生成できるため、メモリ消費を最小限に抑えられるのが特徴です。時間計算量は O(n)、空間計算量は O(1) となります。

実行結果

コンソールへの出力は以下の通りです。

44
10
798

上限が 10 の場合は偶数項が 2, 8 のみなので合計は 10、上限が 1000 の場合も同様のロジックで 798 という結果が得られます。

  1. JavaScriptで配列の合計値が偶数か奇数かを判定する方法

    本記事では、配列内の全要素の合計を求め、その結果が偶数か奇数かに応じて文字列を返すJavaScript関数の実装方法を解説します。 問題 整数の配列 arr を引数として受け取るJavaScript関数を作成する必要があります。この関数は、配列内のすべての要素の合計が奇数であれば文字列「odd」を、偶数であれば文字列「even」を返すようにします。 解決のアプローチ まず、配列メソッドの reduce() を使って配列全体の合計値を算出します。次に、合計値を 2 で割った余り(剰余演算子 % の結果)が 0 かどうかをチェックすることで、偶数・奇数の判定を行います。 コード例 以下が実際のコ

  2. 【C++】合計がKとなる最小個数のフィボナッチ数を求める方法

    この記事では、数値Kが与えられたときに合計がKに等しくなる最小個数のフィボナッチ数を求める問題について解説します。フィボナッチ数列とはフィボナッチ数列とは、直前の2つの数を足し合わせることで次の数を生成していく数列です。数列はF0とF1という2つの初期値から始まり、一般にF0=0、F1=1(またはF0=1、F1=1)が用いられます。フィボナッチ数列は「0, 1, 1, 2, 3, 5, 8, 13 …」のように続きます。問題の例入力:K = 5出力:2説明:5は 3 + 2 の合計で表すことができます。解き方のアプローチ1自体がフィボナッチ数であるため、フィボナッチ数の組み合わせによって任意の