1. n=5 -> 25
  2. n=0 -> 0
  3. n=1 -> 1
  4. n=3 -> 9
  5. n=10 -> 100
  6. n=-2 -> 0
コース一覧
コンピューターサイエンス入門:理論編
入れ子ループの実行回数

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

入れ子ループの実行回数

計算量の伸び方

同じ n なのに、待ち時間が 100 倍違う

前回、1 重のループは n 回まわると数えました。ところが同じ n でも、書き方ひとつで回数は桁違いに変わります。n = 1000 のとき、1 重なら 1000 回で終わります。ループの中にもう 1 つループを入れると、100 万回です。体感で言えば、すぐ返ってくる画面と、開いたまま固まる画面の差になります。

この差はどこから来るのか。答えは単純で、入れ子にすると回数は足し算ではなく掛け算になる からです。

並べて書けば足し算、入れ子にすれば掛け算

まず、ループを 2 つ並べて書いた場合です。

Python

for m in members: print(m) for r in rooms: print(r)

members を全部見てから、rooms を全部見ます。3 人と 4 部屋なら 3 + 4 = 7 行です。片方が終わってからもう片方が始まるので、当然そうなります。

次に、片方をもう片方の中に入れます。

Python

sizes = ["S", "M", "L"] colors = ["白", "黒"] for s in sizes: for c in colors: print(s, c)

出るのは 6 行です。S 白 S 黒 M 白 M 黒 L 白 L 黒 と、すべての組み合わせが並びます。外側が 1 つ進むあいだに、内側は最後まで一往復します。だから 3 × 2 = 6 です。

外側も内側も同じ n 件を見るなら、回数は n × n になります。これが O(n^2) の正体です。

n を 10 倍すると、待ち時間は 100 倍

O(n^2) の怖さは、増え方が加速するところにあります。n = 10 なら 100 回、n = 100 なら 1 万回、n = 1000 なら 100 万回、n = 10000 なら 1 億回。n を 10 倍するたびに、回数は 100 倍です。

Python

n = 10000 print(n * n) # 100000000 print(n * (n - 1) // 2) # 49995000

内側の範囲を外側に合わせて短くしても、結論は変わりません。1 + 2 + ... + (n - 1) は上の式のとおり n^2 のおよそ半分です。半分になっても増え方は 2 乗のままなので、オーダーは O(n^2) のままです。定数倍は無視するという約束が、ここで効いてきます。

解説

見分け方は簡単です。ループが縦に並んでいれば足し算、字下げが深くなっていれば掛け算です。字下げの深さが、そのまま指数になります。

要件

  1. 2 重 for ループ (外側 n 回・内側 n 回) で実行回数を数えること
  2. n <= 0 の場合は 0 を返すこと
  3. 戻り値は整数 (int) であること

入出力例

countNested(5) → 25 countNested(0) → 0 countNested(1) → 1 countNested(3) → 9 countNested(10) → 100 countNested(-2) → 0

ヒント

外側と内側で別の変数 (i と j) を使う

内側の count += 1 は n * n 回実行される

n^2 = n * n を直接返してもテストは pass するが、本問の趣旨はループで数えること

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

関連レッスン

  • 線形探索 (O(n))

    配列の先頭から順に target を探す線形探索を実装し、O(n) の挙動と最悪計算量を理解する。

  • 二分探索 (O(log n))

    ソート済み配列に対して中央から半分ずつ範囲を狭める二分探索を実装し、O(log n) の威力を理解する。

  • バブルソート

    隣り合う要素を比較・交換していくバブルソートを実装し、O(n^2) の整列アルゴリズムを体感する。

  • 配列の最大と最小

    配列の最大値と最小値を 1 回のスキャンで求める。O(n) で全要素を見る典型例。

main.py
学習モード
エディタを読み込んでいます

メモ

入れ子ループの実行回数

⌘S で保存