1. fib(0) = 0
  2. fib(1) = 1
  3. fib(2) = 1
  4. fib(5) = 5
  5. fib(10) = 55
  6. fib(20) = 6765
  7. fib(30) = 832040
コース一覧
コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
メモ化フィボナッチ

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ソート、探索、再帰などのアルゴリズムに加え、OS (プロセス、メモリ、ファイルシステム)、ネットワーク (TCP/IP、HTTP、DNS、CDN)、データベースまで、Web エンジニアに必要な CS の基礎を一本で学べる総合コースです。エンジニア転職を目指す学習者や、CS 出身でない現役エンジニアを対象としています。約 34 時間 (1 日 30 分 × 68 日) で 135 レッスンを修了でき、修了後は技術選定やシステム設計の議論に自信を持って参加できるようになります。

1
再帰の基礎
01. 階乗(再帰)5分
02. フィボナッチ数(再帰)5分
03. 累乗(再帰)5分
04. 配列の合計(再帰)5分
05. 桁数を数える(再帰)5分
06. 文字列を逆順(再帰)5分
07. ユークリッドの互除法(GCD)5分
08. 第1章まとめクイズ — 再帰の基礎5分
2
第2章 探索
01. 線形探索で位置を返す5分
02. 二分探索 (反復版)5分
03. 二分探索 (再帰版)5分
04. lower_bound (最初に >= target の位置)5分
05. ピーク要素検索5分
06. 回転ソート配列での探索5分
07. 第2章まとめクイズ5分
3
ソート
01. バブルソート実装5分
02. 選択ソート5分
03. 挿入ソート5分
04. マージソート5分
05. クイックソート5分
06. カウントソート5分
07. 比較関数つきソート5分
08. 第3章まとめクイズ5分
4
配列 / 文字列の応用
01. 双方向ポインタで和 = K5分
02. スライド窓の最大和5分
03. 回文判定5分
04. 重複なし最長部分文字列5分
05. 大きな数の文字列乗算5分
06. アナグラムグルーピング5分
07. 第4章まとめクイズ — 配列 / 文字列の応用5分
5
クラスと OOP
01. 長方形クラス(面積と周長)5分
02. スタッククラス(push と pop)5分
03. キュークラス(enqueue と dequeue)5分
04. 単方向リンクリスト5分
05. 二分探索木 (BST) への挿入5分
06. カウンタクラス(機能合成)5分
07. 第 5 章クイズ — クラスと OOP5分
6
動的計画法 (基礎)
01. メモ化フィボナッチ5分
02. DP配列でフィボナッチ5分
03. 階段の登り方5分
04. コイン両替最小枚数5分
05. 0/1 ナップサック問題5分
06. 最長共通部分列 (LCS)5分
07. 第6章まとめクイズ5分
7
総合演習
01. ソート済み 2 配列のマージ5分
02. 配列の k 回転5分
03. カッコの妥当性5分
04. ローマ数字を整数に5分
05. 整数をローマ数字に5分
06. 雨水を溜める5分
07. 最終総まとめクイズ5分
8
[OS] Section 1. OS とは
01. コンピューターとOSの役割15分
02. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
03. カーネルとユーザーランド15分
04. システムコールの仕組み15分
05. Linux / macOS / Windows のアーキ比較15分
9
[OS] Section 2. プロセスとスレッド
01. プロセスとは15分
02. スレッドとプロセスの違い15分
03. コンテキストスイッチ15分
04. スケジューラとアルゴリズム15分
05. プロセス間通信(IPC)15分
10
[OS] Section 3. メモリ管理
01. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
02. 仮想メモリ15分
03. ページングとスワップ15分
04. mmap とメモリマップトファイル15分
05. ガベージコレクション概要15分
11
[OS] Section 4. ファイルシステム
01. ファイルシステムとは15分
02. i-node とディレクトリ15分
03. ext4 / APFS / NTFS の違い15分
04. ジャーナリングと耐障害性15分
05. パーミッションと所有者15分
12
[OS] Section 5. 同期と並行性
01. レースコンディション15分
02. Mutex と Semaphore15分
03. デッドロック15分
04. 非同期と並行15分
05. イベントループと epoll15分
13
[ネットワーク] ネットワークの全体像
01. ネットワークとは8分
02. OSI 7階層モデル10分
03. TCP/IP 4階層モデル9分
04. パケットとフレーム9分
05. ルーター・スイッチ・ハブ9分
14
[ネットワーク] IP とルーティング
01. IPアドレス (IPv4 / IPv6)10分
02. サブネットマスクと CIDR11分
03. NAT とプライベートIP9分
04. ルーティングと経路選択10分
05. ファイアウォール基礎9分
15
[ネットワーク] TCP / UDP
01. TCP と UDP の違い9分
02. 3-way ハンドシェイク9分
03. 輻輳制御と再送10分
04. UDP の用途 (DNS / 動画 / ゲーム)8分
05. ポート番号と well-known port9分
16
[ネットワーク] HTTP / HTTPS
01. HTTP の基本10分
02. HTTP メソッド9分
03. HTTPS と TLS ハンドシェイク10分
04. HTTP/2 と HTTP/3 (QUIC)10分
05. REST API の設計原則10分
17
[ネットワーク] DNS とドメイン
01. DNS とは8分
02. レコードタイプ10分
03. 名前解決の流れ10分
04. DNS キャッシュと TTL9分
05. CDN の仕組みと Anycast10分
18
[ネットワーク] 応用
01. ロードバランサ (L4 / L7)10分
02. プロキシとリバースプロキシ9分
03. WebSocket とリアルタイム通信9分
04. gRPC と HTTP/2 利用10分
19
[データベース] データベースの基礎
01. データベースとは8分
02. RDB と NoSQL の違い8分
03. データベースの歴史8分
04. エンティティ関係モデル (ER)8分
05. 主キー・外部キー・候補キー8分
20
[データベース] 正規化
01. 正規化とは何か8分
02. 第1正規形8分
03. 第2正規形8分
04. 第3正規形8分
05. 非正規化のトレードオフ8分
21
[データベース] インデックスと B-tree
01. インデックスの役割8分
02. B-tree の仕組み8分
03. B+tree(実際の DB 実装)8分
04. ハッシュインデックス8分
05. カバリングインデックス8分
22
[データベース] トランザクションと ACID
01. トランザクションとは8分
02. ACID 特性8分
03. 分離レベル8分
04. MVCC(マルチバージョン同時実行制御)8分
05. デッドロックと回避8分
23
[データベース] クエリ最適化
01. クエリプランナの役割8分
02. EXPLAIN の読み方8分
03. Nested Loop / Hash / Merge Join8分
04. インデックスチューニング8分
05. 統計情報とカーディナリティ8分
24
[データベース] スケーリング
01. レプリケーション8分
02. シャーディング8分
03. CAP 定理8分
04. 結果整合性8分
05. NewSQL と分散 SQL8分

メモ化フィボナッチ

フィボナッチ数は fib(k) = fib(k-1) + fib(k-2) で決まります。この式をそのまま再帰にすると、数行で書けるのに、n を 40 にした途端に返ってこなくなります。式は正しいのに遅い。その理由を数えるところから始めます。

fib(5) を出すのに、fib(2) を 3 回計算している

fib(5) は fib(4) と fib(3) を呼び、fib(4) はまた fib(3) と fib(2) を呼びます。

diagram (will load when visible)

fib 3 が 2 回、fib 2 が 3 回出てきます。しかも 2 回目の fib 3 は、1 回目とまったく同じ計算を最初からやり直しています。呼び出しの総回数を数えると、次のように伸びます。

n呼び出し回数
515
10177
2021,891
302,692,537
40331,160,281

n が 10 増えるごとに、およそ 123 倍です。答えは n + 1 種類しかないのに 3 億回計算しているのだから、無駄なのは計算の中身ではなく、同じ問いを何度も出していることのほうです。

2 回目からは、書き留めた答えを読む

対策は 1 つだけです。出した答えをその場で書き留めておき、次に同じ問いが来たら計算せずに読み出します。例として、組み合わせの数で試します。comb(n, k) は comb(n-1, k-1) + comb(n-1, k) で決まり、これも素朴に書くと同じ重複が起きます。

Python

def comb(n, k, memo=None): if memo is None: memo = {} if k == 0 or k == n: return 1 if (n, k) in memo: return memo[(n, k)] memo[(n, k)] = comb(n - 1, k - 1, memo) + comb(n - 1, k, memo) return memo[(n, k)]

書き留める場所を用意し、答える前に覗き、返す前に書き込む。この 3 つだけです。同じ (n, k) は一度しか計算されなくなるので、計算回数は答えの種類の数までしか増えません。

こうして途中の答えを覚えておく手を メモ化、fib(k) = fib(k-1) + fib(k-2) のように自分自身で自分を表す式を 漸化式、小さいほうから順に埋めていくやり方を ボトムアップ と呼び、これらを使う設計法をまとめて 動的計画法 と言います。

書き留めた紙を、次の人に渡してしまう

Python

memo = {} # 関数の外に置くと呼び出しをまたいで残る def f(k): ...

書き留める場所を関数の外に作ると、前の呼び出しの結果が次の呼び出しにも残ります。同じ計算をする関数なら得に見えますが、途中で条件が変わる問題では前の答えが混ざり、原因の分かりにくい間違いになります。書き留める場所は、外から呼ばれる関数の中で作るのが安全です。

やってみよう

fibMemo(n) を書いてください。fib(0) は 0、fib(1) は 1、それ以外は 1 つ前と 2 つ前の和です。書き留める場所を用意し、答える前に覗いて、返す前に書き込む形にします。辞書でも、長さ n + 1 の配列でも構いません。n が 30 でも一瞬で返れば成功です。

要件

  1. fib(0) = 0、fib(1) = 1、それ以外は fib(k) = fib(k-1) + fib(k-2) を満たすこと
  2. メモ化を使い、各 k についての計算が 1 回で済むようにすること (計算量 O(n))
  3. n = 30 でも一瞬で結果が返ること (素朴再帰では数秒かかる)

入出力例

fibMemo(0) → 0 fibMemo(1) → 1 fibMemo(2) → 1 fibMemo(5) → 5 fibMemo(10) → 55 fibMemo(20) → 6765 fibMemo(30) → 832040

ヒント

辞書 (Python) や Map (JS) を用意し、既に計算済みの k は再計算せずに保存値を返す

再帰関数の中で memo を参照する。クロージャや内部関数で memo を共有すると書きやすい

fib(0) = 0、fib(1) = 1 を基底ケースにし、k >= 2 のときだけ memo を見にいく

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

関連レッスン

  • DP配列でフィボナッチ

    再帰を使わず、配列とループでフィボナッチ数を計算する「ボトムアップ DP」を学ぶ。スタックを使わないので大きな n でも安全。

  • 階段の登り方

    1段または2段ずつ登れる階段の登り方の総数を DP で数える。漸化式の発見と基底ケースの設定を体得する。

  • コイン両替最小枚数

    額面の決まったコインで指定金額を作る最小枚数を DP で求める。状態遷移を「複数選択肢の min」で書く感覚を身につける。

  • 0/1 ナップサック問題

    重さと価値を持つ品物を限られた容量に詰め、価値合計を最大化する古典的な 2 次元 DP 問題に挑む。

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

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

  • 再帰関数が自分自身を呼び出す処理パターン
  • 設計何をどう作るかを決める前工程
  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • メモ化計算済みの結果を保存して再利用する
  • 計算量入力サイズに対する処理時間の伸び方
main.py
学習モード
エディタを読み込んでいます

メモ

メモ化フィボナッチ

⌘S で保存