JavaScriptで二項式 (ax+b)^n を展開する方法
問題
(ax+b)n の形式で書かれた式を受け取り、その展開形を文字列として返すJavaScript関数を作成する必要があります。ここで a と b は正または負の整数、x は任意の一文字の変数、n は自然数です。なお、a = 1 の場合は変数の前に係数を付けません。
関数は ax^b+cx^d+ex^f… のような形式の文字列を返します。a・c・e は各項の係数、x は元の式で渡された一文字の変数、b・d・f は各項における x の指数で、指数は降順に並べます。
コードのポイント
この実装は、おおむね次のような流れで処理を行っています。
- 式の解析: 正規表現
/(\W)(\d*)(\w)(\W)(\d+)..(\d+)/を使って、入力文字列から符号・係数・変数・定数・指数を分解して取り出します。 - エッジケースの処理: 指数 n が 0 のときは文字列 '1' を、n が 1 のときは括弧の中身をそのまま返します。
- 階乗の事前計算: 再帰的な
factorial()関数で 0! から n! までをあらかじめ配列に格納し、二項係数(組み合わせの数)の計算に利用します。 - 各項の組み立て: ループで指数を降順にたどりながら各項の値を計算し、値が 0 になる項はスキップします。係数が 1 や -1 の場合は
trim()関数によって符号のみを表示し、指数が 1 のときは ^ 表記を省略します。 - 最終的な整形: 文字列中の '+-' を '-' に置き換え、末尾の余分な '+' を削除して結果を整えます。
例
以下が実際のコードです −
const str = '(8a+6)^4';
const trim = value => value === 1 ? '' : value === -1 ? '-' : value
const factorial = (value, total = 1) =>
value <= 1 ? total : factorial(value - 1, total * value)
const find = (str = '') => {
let [op1, coefficient, variable, op2, constant, power] = str
.match(/(\W)(\d*)(\w)(\W)(\d+)..(\d+)/)
.slice(1)
power = +power
if (!power) {
return '1'
}
if (power === 1) {
return str.match(/\((.*)\)/)[1]
}
coefficient =
op1 === '-'
? coefficient
? -coefficient
: -1
: coefficient
? +coefficient
: 1
constant = op2 === '-' ? -constant : +constant
const factorials = Array.from({ length: power + 1 }, (_,i) => factorial(i))
let result = ''
for (let i = 0, p = power; i <= power; ++i, p = power - i) {
let judge =
factorials[power] / (factorials[i] * factorials[p]) *
(coefficient * p * constant * i)
if (!judge) {
continue
}
result += p
? trim(judge) + variable + (p === 1 ? '' : `^${p}`)
: judge
result += '+'
}
return result.replace(/\+\-/g, '-').replace(/\+$/, '')
};
console.log(find(str));
出力
576a^3+1152a^2+576a
-
JavaScriptの名前付き関数式とは?実装方法と動作をわかりやすく解説
名前付き関数式(Named Function Expression)とはJavaScriptでは、関数式に対して名前を付けることができます。これを「名前付き関数式」と呼びます。通常の無名関数式と異なり、付けた名前はその関数の内部でのみ参照可能という特徴があります。この仕組みを活用すると、以下のようなメリットがあります。関数内部から自分自身を呼び出す再帰処理が書きやすくなるデバッグ時のスタックトレースに関数名が表示され、エラー箇所の特定が容易になるサンプルコード以下は、オブジェクトのプロパティとして名前付き関数式「factorial」を定義し、階乗を計算する例です。<!DOCTYPE ht
-
JavaScriptで<text>要素の値を変数に抽出する方法
JavaScriptで要素の値を変数に抽出するにはSVGの<text>要素のテキスト値を変数に抽出したい場合は、textContentプロパティを使用します。基本的な書き方は以下の通りです。document.getElementById(yourTextIdValue).textContentgetElementById()メソッドで対象の要素をIDから取得し、そのtextContentプロパティを参照することで、要素内のテキストを文字列として変数に格納できます。textContentとinnerHTMLの違いなお、SVG要素の場合はinnerHTMLよりもtextContentを