1. 3 + 4 = 7
  2. 0 + 0 = 0
  3. 10 + 5 = 15
  4. -2 + 5 = 3
  5. 100 + 200 = 300
  6. -5 + -3 = -8
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
カリー化

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

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な 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分

カリー化

同じ引数を、毎回書いている

税込み価格を出す関数を addTax(price, rate) の形で作ったとします。呼ぶ側は毎回 addTax(price, 0.1) と書きます。20 か所で呼んでいれば 0.1 が 20 回並び、税率が変わったら 20 か所を直します。

配列にまとめてかけたいときも、そのままでは渡せません。

JavaScript

prices.map(price => addTax(price, 0.1));

この price => ... は、0.1 を渡すためだけに書いた包み紙です。中身のある処理は 1 つも増えていないのに、行だけが増えています。

先に決めておいて、後で残りを渡す

2 つの引数を同時に受け取るのをやめます。先に決まる方だけを受け取り、残りを受け取る関数を返す形にすると、設定を 1 回で済ませられます。

JavaScript

const taxAdder = (rate) => (price) => Math.round(price * (1 + rate)); const addJpTax = taxAdder(0.1); addJpTax(980); // 1078 prices.map(addJpTax); // 包み紙が要らない

taxAdder(0.1) が返した関数は、0.1 を覚えたままです。関数が、作られたときの外側の変数を覚えている性質をクロージャと呼びます。この覚えておく仕組みがあるので、設定と入力を別のタイミングで渡せます。

先に受け取る引数は、変わりにくいものを選びます。税率は画面が変わっても同じですが、価格は 1 件ごとに変わります。変わりにくい方を先に置くと、作った関数を長く使い回せます。逆にすると毎回作り直すことになり、包み紙を書いていたときと手間が変わりません。

相性が良いのは「最初に 1 回決めて、あとは何度も使う値」です。税率のほかに、区切り文字、ログの接頭辞、通貨記号、切り上げの桁などが当てはまります。csvLine と tsvLine のように、区切り文字だけ違う関数を 2 本作る、といった使い方もできます。

呼び出しが 2 段階になる

この形にすると、呼び出しの括弧が 2 つ続きます。設定を先に渡してから値を渡すので、まとめて書けば taxAdder(0.1)(980) です。見慣れないうちは、この見た目でつまずきます。

よくある間違いは、1 段目で止めて結果を使おうとすることです。taxAdder(0.1) の中身は数値ではなく関数なので、そのまま足したり比べたりしても、期待した値にはなりません。テストの結果に function や <function ...> という文字が出てきたら、括弧が 1 つ足りていないと思ってください。

逆に、設定を渡さずにいきなり値を渡すのも同じ間違いです。1 段目が受け取るのは設定で、値ではありません。どちらの引数が先に決まるのかを決めてから書き始めると、この取り違えは起きません。

解説

覚え方 ... 括弧が 2 つ続いたら「先に設定、後でデータ」。順番を決めるのは、どちらが先に決まるか。

要件

  1. 関数の中で curriedAdd のような関数を定義し、curriedAdd(a)(b) の形で呼び出す
  2. curriedAdd(x) は (y) => x + y のような関数を返すこと
  3. 戻り値は整数。式は a + b と等価

入出力例

curriedAddAndApply(3, 4) → 7 curriedAddAndApply(0, 0) → 0 curriedAddAndApply(10, 5) → 15 curriedAddAndApply(-2, 5) → 3 curriedAddAndApply(100, 200) → 300 curriedAddAndApply(-5, -3) → -8

ヒント

Python なら def curriedAdd(x): return lambda y: x + y のようにネストする

JS のアロー関数なら (x) => (y) => x + y で 1 行で書ける

curriedAdd(a) の戻り値は関数。それを (b) で呼び出して初めて数値になる

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

関連レッスン

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

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

  • Union-Find (連結成分数)

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

  • 最終総まとめクイズ

    cs-system-design コース全体の総まとめクイズ。連結リスト、二分木、BST、ハッシュ、グラフ、動的計画法、関数型の知識を確認する。

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

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

  • 引数位置引数=順番で渡す。
  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • 処理計算や代入を表す長方形
  • 変数データに名前をつけて参照する仕組み
  • テストバグを見つける工程
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

カリー化

⌘S で保存