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

JavaScriptを使用して指定された項数までの数列の合計を求める方法


問題

次のような数列を考えてみましょう。

数列: 1/1 , 1/(1×2) , 1/(1×2×3) , 1/(1×2×3×4) , …

この数列の第n項は、次の式で表されます。

1 / (1 × 2 × 3 × … × n)

つまり、各項は「1をその項番号の階乗(n!)で割った値」になっています。本記事では、数値nを受け取り、この数列の最初のn項の合計を返すJavaScript関数を作成します。

解き方のアプローチ

合計を求める手順は以下のとおりです。

  • 合計を保持する変数を0で初期化します。
  • ループ内で階乗の値を順次更新しながら、その都度「1 ÷ 階乗」を合計に加算していきます。
  • n項目までの計算が完了したら、合計値を返します。

ポイントは、階乗を毎回ゼロから計算し直す必要がないことです。前の項で求めた階乗値を再利用することで、効率よく計算できます。

コード例

以下が実際のコードです。

const num = 12;

// 階乗を計算するヘルパー関数
const factorial = (n) => {
   let fact = 1;
   for (let i = 2; i <= n; i++) {
      fact *= i;
   }
   return fact;
};

// 数列の最初のnum項の合計を返す関数
const seriesSum = (num = 1) => {
   let sum = 0;
   for (let i = 1; i <= num; i++) {
      sum += 1 / factorial(i);
   }
   return sum;
};

console.log(seriesSum(num));

出力

コンソールには次のように表示されます。

1.7182818282861683

補足:収束と精度の関係

この数列の合計は、項数を増やすにつれてe − 1(約1.718281828)に収束することで知られています。階乗は極めて速く増大するため、各項の値は急激に小さくなり、十数項程度計算するだけで小数第10位程度の精度が得られます。

そのため、「指定された精度で合計を求めたい」という場合は、必要な精度に応じて十分大きな項数nを選べばよいことになります。逆に言えば、項数nを指定することは、結果の精度を実質的に指定することと同じなのです。


  1. 【JavaScript】配列内のネストされたオブジェクトの値を合計する方法

    この記事では、JavaScriptを使って、配列内にネストされた(入れ子構造の)オブジェクトの値を合計する方法を解説します。サンプルコードでは、JSONデータの複数階層に格納された数値(costNum)を順番に取り出し、その合計をブラウザ上に表示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=d

  2. JavaScriptで配列内の最長フィボナッチ部分列を見つける方法

    フィボナッチ数列とは 数列 X_1, X_2, ..., X_n がフィボナッチ数列であるとは、以下の条件を満たすことを指します。 n >= 3 である すべての i + 2 <= n に対して、X_i + X_{i+1} = X_{i+2} が成り立つ つまり、隣り合う2項の和が常に次の項になる数列のことです。 問題の概要 数値の配列 arr を第1引数(唯一の引数)として受け取り、配列 arr 内に存在する最長のフィボナッチ部分列の長さを見つけて返すJavaScript関数を作成する必要があります。 ここでいう「部分列」とは、元の配列 arr から任意の個数の要素(0個で