関数の配列を受け取り、右から左へ順に適用する合成関数を返す。
reduceRight による O(n)
パイプライン実装。
関数の配列
functions = [f1, f2, ..., fn]
を受け取り、
右から左へ順に適用する合成関数を返す。
-1000 ≤ x ≤ 1000
0 ≤ functions.length ≤ 1000
reduceRight の初期値
x が、
空配列時に恒等関数として自然に機能する。特別な分岐が不要。
例:
functions = [x=>x+1, x=>x*x, x=>2*x], x = 4
type F = (x: number) => number;
/**
* 関数配列の右から左への合成を返す。
* 空配列の場合は恒等関数を返す。
*
* @param functions - 合成する関数の配列(右端から順に適用)
* @returns 合成された関数
* @complexity Time: O(n) per call, Space: O(1)
*/
function compose(functions: readonly F[]): F {
// reduceRight の初期値 x が空配列時の恒等関数を自然に実現する
return function (x: number): number {
return functions.reduceRight(
(acc: number, fn: F): number => fn(acc),
x
);
};
}
/**
* const fn = compose([x => x + 1, x => x * x, x => 2 * x]);
* fn(4); // 65 (2*4=8 → 8²=64 → 64+1=65)
*
* const id = compose([]);
* id(42); // 42 (恒等関数)
*/
フロー解説:
1.
compose
が呼ばれると即座にクロージャを返す(O(1))
2. 返された関数
fn(x)
が呼ばれたとき実際の計算が始まる(O(n))
3. 空配列の場合は reduceRight の初期値 x
がそのまま返る → 恒等関数
4. 要素がある場合は右端から fn を順に acc に適用し、最終 acc を返す
| アプローチ | 時間計算量 | 空間計算量 | 型安全性 | 可読性 |
|---|---|---|---|---|
| reduceRight ✓ | O(n) | O(1) | ⭐⭐⭐ | ⭐⭐⭐ |
| for ループ(右→左) | O(n) | O(1) | ⭐⭐⭐ | ⭐⭐ |
| 再帰 | O(n) | O(n) | ⭐⭐ | ⭐⭐ |