JavaScriptで数列の和を計算する方法
問題
次のような級数の和を考えてみましょう。
$$seq(n,\:p)=\displaystyle\sum\limits_{k=0}^{n}(-1)^{k}\times\:p\:\times 4^{n-k}\:\times\frac{2n-k}{k}$$
この問題では、数値 n と p を引数として受け取り、seq(n, p) の計算結果を返すJavaScript関数を作成することが求められます。
この級数は以下の要素で構成されています。
- (-1)k: kが偶数なら正、奇数なら負となる交互符号
- p: 固定の係数
- 4n-k: 4の冪乗
- (2n-k)/k: kに応じて変化する倍率
解決策
forループを使って k = 0 から n まで各項を順に計算し、合計を累積していくのが最もシンプルなアプローチです。以下が実装例です。
const n = 12;
const p = 70;
const findSeqSum = (n, p) => {
let sum = 0;
for(let k = 0; k <= n; k++){
// kが偶数なら +1、奇数なら -1(交互符号)
const power = k % 2 === 0 ? 1 : -1;
// 4の(n-k)乗
const fourPower = Math.pow(4, (n - k));
// 倍率(kが0の場合は1に置き換えてゼロ除算を回避)
const multiplier = ((2 * n) - k) / (k || 1);
const term = (power * p * fourPower * multiplier);
sum += term;
};
return sum;
};
console.log(findSeqSum(n, p));コードのポイント
- 交互符号の実現: 三項演算子
k % 2 === 0 ? 1 : -1により、項ごとに正負を切り替えています。 - 冪乗の計算:
Math.pow()を使って 4n-k を求めています。ES2016以降ならべき乗演算子4 ** (n - k)も使えます。 - ゼロ除算の回避:
(k || 1)という書き方により、k が 0 のときは分母を 1 に置き換え、InfinityやNaNが発生するのを防いでいます。
出力
上記のコードをコンソールで実行すると、次の出力が得られます。
22131141616.42424
このように、ループによる逐次計算だけで、複雑な記号を含む級数の和も簡単に求めることができます。
-
JavaScriptで数値配列の分散を計算する方法
問題昇順にソートされた数値の配列を受け取り、その分散(Variance)を計算するJavaScript関数を作成する必要があります。分散とは、一連の数値が平均値からどれだけばらついているかを表す統計量で、まず平均値を求め、その平均との差の二乗和をデータ数で割ることで計算できます。計算式まず、平均値(M)は次のように定義されます。$Mean (M) = ( \sum_{i=0}^{n-1} arr[i])$ / n続いて、分散(V)は各要素と平均値の差を二乗し、それらを合計してデータ数で割った値になります。Variance (V) = $(\sum_{i=0}^{n-1} (arr[i] - M
-
JavaScriptで桁の和が回文数かどうかを判定する関数を作る方法
問題概要今回は、数値 num を第1引数(唯一の引数)として受け取る JavaScript 関数を作成します。この関数は、num の各桁の数字を合計した値が回文数(palindrome number)である場合に true を返し、そうでない場合は false を返す必要があります。例えば、関数への入力が次のようだったとします。const num = 781296;このとき、期待される出力は以下の通りです。const output = true;出力の解説781296 の各桁の和を計算すると、7 + 8 + 1 + 2 + 9 + 6 = 33 となります。33 は左右から読んでも同じ値になる