回 8-5 分野 8 考え方
分割統治法は、
読み終えたら大きな
この頁の流れ
大きな
10 段の 階段を、 1 段か 2 段ずつ上る 方法は何通りか
答えは
10 段目に
大きな
小問題に 分ける 2 つの形
形 1、 1 つ 小さい 答えから作る
階段の
f(n) = f(n − 1) + f(n − 2)、
f(0) = 1 は「0 段は、
| n | f(n) | 作り方 |
|---|---|---|
| 0 | 1 | 決めた値 |
| 1 | 1 | 決めた値 |
| 2 | 2 | 1 + 1 |
| 3 | 3 | 2 + 1 |
| 4 | 5 | 3 + 2 |
| 5 | 8 | 5 + 3 |
| 6 | 13 | 8 + 5 |
| 7 | 21 | 13 + 8 |
| 8 | 34 | 21 + 13 |
| 9 | 55 | 34 + 21 |
| 10 | 89 | 55 + 34 |
前の
形 2、 半分に 分けて 組み合わせる
並べ替え (ソート) の
| 段 | やること | 1 段の |
|---|---|---|
| 分ける | 長さ n を | 0 |
| 解く | 半分ずつを | (下の |
| 合わせる | 先頭どうしを | 多くて |
半分に
2 つの形の違い
マージソートで
| 小問題が | 小問題が重なる | |
|---|---|---|
| 例 | マージソート、二分探索 | 階段の |
| 速くするには | 分け方と | 解いた |
| よく | 分割統治法 | 動的計画法 |
分ける ときに 決めること
小問題に
- どう
分けるか (最後の 1 歩で分ける、 半分に分ける) - いちばん
小さい 問題の 答え (f(0) = 1、 長さ 1 の 列は そのまま) - 小さい
答えから 大きい 答えを 作る 式 (足す、 合わせる)
いちばん
動かして確かめる
1 本目は、
動かす 階段の上り方を小さい方から
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
1 段 1 1
2 段 2 2
3 段 3 3
10 段 89 89式で
2 本目は、lru_cache は、
動かす 呼ばれる回数を比べる
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
10 段 89 呼び出し 177
20 段 10946 呼び出し 21891
30 段 1346269 呼び出し 2692537
メモ化 1346269 計算 31そのまま
3 本目は、
動かす マージソートの比べる回数
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
8 True
15 24 28
1024 True
8915 10240 523776
65536 True
965830 1048576 21474508802 行目の 3 つの数は、
小問題に 分けると外れる所
重なる 小問題を そのまま 再帰で解く
2 本目の
再帰が 深すぎて止まる
Python は、sys.getrecursionlimit() で
動かす 再帰の深さの上限
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
上限 1000
RecursionError
ループなら桁数 1045深い問題は、1 本目のように
分けても 速くならない分け方
マージソートが
仕事と コンテストで どう使うか
小問題に
- ソートと
探索。 マージソートは 半分に 分けて 合わせ、 二分探索は 半分に 分けて 片方を捨てる - 動的計画法。
料金の 最小、 通り数、 最長の 共通部分のように、 小さい 答えから 大きい 答えを 作れる 問題。 コーディングテストの定番 - 木の処理。フォルダの容量の
合計は、 子フォルダの 容量の 合計から 作れる。 木構造は、 同じ形の 小さな 木の集まり - 大きな
仕事の 分担。 大きな データを 分けて 別々の 機械で 処理し、 結果を 合わせる 考え方も同じ形 - 累乗の
計算。 a^n を a^(n/2) の 2 乗で 作ると、 掛け算の 回数は 約 log2 n 回に なる (3-2 の 繰り返し二乗法)
よくある問い
分割統治法とは何ですか
大きな
分割統治法と 動的計画法の 違いは何ですか
どちらも
再帰と ループの どちらで 書けば よいですか
式を
分割統治法の 計算量は どう 見積もりますか
何段に
確認クイズ
答えだと
1 問目
1 段、2 段、3 段のどれかずつ上る
2 問目
マージソートで
3 問目
f(n) = f(n − 1) + f(n − 2) を
説明課題
「10 段の階段を 1 段か 2 段ずつ上る
自分の
この回の 先の一歩
「この
もっと深く
この
一次資料
どれも 2026年10月30日に開いて、
- functools.lru_cache (Python 公式文書、英語)。関数の答えを
引数ごとに 覚えて 使い回し、 cache_info()で覚えた 数を 見られること - sys.getrecursionlimit と
sys.setrecursionlimit (Python 公式文書、英語) 。再帰の深さの 上限を 返すことと、 上限は C の スタックが あふれて Python が 落ちるのを 防ぐ ためにあること - RecursionError (Python 公式文書、英語)。最大の
再帰の 深さを 超えた ときに出る例外 - sorted と
並べ替えの 。手引き (Python 公式文書、英語) sortedが新しい 並んだ列を 返すこと (3 本目の 答え合わせに使った)