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