1. [1,2,3,4] -> 24
  2. [2,5] -> 10
  3. single element
  4. with 1 -> identity
  5. contains zero
  6. negative
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
reduce で積を計算

コンピューターサイエンス上級:アルゴリズムとデータ構造

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な CS の知識を持ち、アルゴリズム力を伸ばしたい学習者や、外資・大手の技術面接対策をしたい方を対象としています。約 13 時間 (1 日 30 分 × 26 日) で 50 レッスンを修了でき、修了後はコーディング面接の実装問題を構造的に解けるようになります。

1
連結リスト
01. リンクリスト構築と長さの計算5分
02. リンクリストの反転5分
03. リンクリストのサイクル検出5分
04. ソート済みリンクリストの merge5分
05. リンクリストの中央ノード取得5分
06. ソート済みリストの重複削除5分
07. 第1章まとめクイズ5分
2
二分木
01. 二分木の in-order 走査5分
02. 二分木の pre-order 走査5分
03. 二分木の post-order 走査5分
04. 二分木の幅優先走査 (BFS)5分
05. 二分木の高さ5分
06. 二分木の平衡判定5分
07. 第2章まとめクイズ — 二分木5分
3
探索木 (BST)
01. BST に値を挿入する5分
02. BST から値を検索する5分
03. BST の最小値と最大値5分
04. BST 妥当性チェック5分
05. BST で k 番目に小さい値5分
06. BST から値を削除する5分
07. 第 3 章 まとめクイズ5分
4
ハッシュとセット
01. hashmap で頻度集計5分
02. キーでグループ化5分
03. two sum (hash で O(n))5分
04. 部分配列の和 = k の個数5分
05. 最長連続部分列5分
06. 集合の積 (intersection)5分
07. 第4章まとめクイズ5分
5
グラフ
01. グラフ BFS で連結成分サイズを求める5分
02. グラフ DFS で連結成分の数を数える5分
03. グラフのパス存在判定5分
04. BFS で最短経路の長さを求める5分
05. トポロジカルソート5分
06. 2 部グラフ判定5分
07. ダイクストラ法 — 重み付きグラフの最短経路15分
08. 第5章まとめクイズ — グラフ5分
6
動的計画法 (上級)
01. 編集距離 (レーベンシュタイン距離)5分
02. 最長増加部分列(LIS)の解法 ── AOJ 2430 対応の動的計画法5分
03. 最大部分配列和 (Kadane)5分
04. 隣り合わない最大値 (House Robber)5分
05. グリッド経路数 (Unique Paths)5分
06. 単語分割可能か (Word Break)5分
07. 第6章まとめクイズ — 動的計画法 (上級)5分
7
総合データ構造と関数型
01. map と filter を組み合わせる5分
02. reduce で積を計算5分
03. 関数合成5分
04. カリー化5分
05. trie の単純検索 (prefix マッチ)5分
06. Union-Find (連結成分数)5分
07. 最終総まとめクイズ5分

reduce で積を計算

集計のたびに、入れ物の変数を用意している

一番長い単語を選びたい、合計を出したい、文字列をつなげたい。書いているコードは毎回よく似ています。

JavaScript

let longest = ""; for (const word of words) { if (word.length > longest.length) longest = word; }

答えを入れる変数を作り、初期値を決め、1 周まわして、最後に返す。この骨組みが集計のたびに現れます。変わっているのは真ん中の 1 行だけなのに、周りの 3 行を毎回書き直しています。

1 つの値に畳む

reduce は、この骨組みごと引き受けてくれます。渡すのは 2 つだけです。1 つは「ここまでの答えと次の要素から、新しい答えを作る関数」。もう 1 つは「最初の答え」です。

JavaScript

const longest = words.reduce( (best, word) => (word.length > best.length ? word : best), "" );

best に入っているのがここまでの答えで、返した値がそのまま次の回の best になります。要素を 1 つずつ受け取りながら、答えを 1 つに畳んでいくので、日本語では畳み込みとも呼びます。配列を 1 周するだけなので、要素が 2 倍になれば時間も 2 倍、という素直な増え方をします。

for との違いは、途中の状態に名前をつけなくてよいことです。longest という変数が、書き換わる箱ではなく、確定した 1 つの結果になります。

畳んだ先は数値でなくても構いません。答えを辞書にすれば「著者ごとの冊数」のような集計になり、答えを配列にすれば並べ替えや詰め替えになります。「1 つの値にまとめる」の 1 つは、1 個の数字という意味ではなく、1 個の入れ物という意味です。

初期値は、空のときの答え

初期値を何にするか迷ったら、「空の配列を渡されたら何を返してほしいか」を考えてください。一番長い単語なら空文字列、合計なら 0、つなげた文字列なら空文字列です。ここが決まると、中の関数も自然に決まります。

JavaScript の reduce は第 2 引数を省くと先頭の要素を初期値として使うので、空の配列を渡した瞬間に例外になります。空が来る可能性があるなら、必ず書いてください。Python の functools.reduce も同じで、初期値を渡さないと空のときに例外になります。

解説

覚え方 ... 初期値は「まだ 1 つも見ていないときの答え」。先にこれを決めると、残りは 1 行で済む。

値が育ちすぎることがある

足し算と違い、掛け算のように 1 要素ごとに値が跳ね上がる集計では、桁あふれに気をつけてください。Python の整数には桁の上限がありませんが、Java の int や Go の int32 は上限を超えた時点で値が壊れ、例外も出ないまま間違った答えが返ります。入力の大きさが読めないときは、64 ビットの整数や多倍長の型を選びます。

要件

  1. 配列の全要素の積を返すこと
  2. 空配列の場合は 1 を返すこと (乗法の単位元)
  3. 戻り値は整数 (int) で返す

入出力例

product([1,2,3,4]) → 24 product([2,5]) → 10 product([7]) → 7 product([1,1,1,1]) → 1 product([3,0,5]) → 0 product([-2,3]) → -6

ヒント

result = 1 から始めて、各要素を掛け合わせるシンプルな for ループでも実装できる

JS なら nums.reduce((acc, n) => acc * n, 1) で 1 行になる。第 2 引数の初期値 1 を忘れずに

0 が含まれていたら結果は 0 になる。早期 return しても良い

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 関数合成

    `compose(f, g)(x) = f(g(x))` の関数合成を関数の中で組み立てて適用する。`addOne` と `double` を合成して値に適用した結果を返す関数を実装する。

  • カリー化

    2 引数の関数を 1 引数の関数のチェーン `f(a)(b)` に変換するカリー化を内部で組み立てて適用する。`add(a, b)` をカリー化して `add(a)(b)` の形で呼び出した結果を返す関数を実装する。

  • trie の単純検索 (prefix マッチ)

    単語の集合に対して `trie` を構築し、与えられたプレフィックスで始まる単語が存在するかを判定する関数を実装する。trie の基本構造とプレフィックスマッチを学ぶ。

  • Union-Find (連結成分数)

    Union-Find (Disjoint Set Union) を使い、辺の集合からグラフの連結成分の数を求める関数を実装する。森のような構造でグループを管理する手法を学ぶ。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 変数データに名前をつけて参照する仕組み
  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 引数位置引数=順番で渡す。
  • ビット2進数の1桁。0 か 1 のどちらか
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

reduce で積を計算

⌘S で保存