← クエスト一覧

クエスト58:lru_cacheでメモ化しよう

スライド 1 / 6
コーデ
💻 コード例
実行結果
← クエスト一覧
🐍 Python / Quest 58 / 85

クエスト58:lru_cacheでメモ化しよう

発展 +10 XP
🏠
今回の課題
再帰関数 fib を作り、メモ化のデコレータを付けて、フィボナッチ数列の fib(10) の値 55 を表示しよう。
📖 解説を見る
⚡ lru_cache(メモ化)って何?

@lru_cache を付けると、関数の結果を覚えておき、同じ引数で呼ばれたら計算せずにすぐ返します。これを「メモ化」といいます。

✏️ 書き方:
from functools import lru_cache

@lru_cache(maxsize=None)
def slow_double(n):
    print(f'{n} を計算中...')
    return n * 2

print(slow_double(5))
print(slow_double(5))

5 を計算中... 10 10 と出ます。2回目は「計算中」が出ません。覚えていた答えをそのまま返したからです。

📋 作るもの:
fib(n)… フィボナッチ数列の n 番目を再帰で計算して返す
n が1以下のときは n をそのまま返す(終わりの条件)
・それ以外は「1つ前」と「2つ前」の結果を足す(数列のルール)
fib の真上にメモ化のデコレータを付ける(付けないと同じ計算を何千回もくり返す)

💡 どこで使う?

同じ計算を何度もくり返す処理を、劇的に速くできます。フィボナッチのような再帰は、素朴に書くと同じ fib(n) を何千回も計算しますが、@lru_cache があれば一度計算した値を使い回します。重いAPI呼び出しの結果を再利用する、といった用途でも役立ちます。

⚠️ ポイント:
fib(n) = fib(n-1) + fib(n-2) が数列のルール
n <= 1 のときはそのまま n を返す(終わりの条件)
ヒントを見る
中身は Q32 の再帰と同じ組み立て方だよ。終わりの条件を先に書いて、それ以外は自分自身を n-1 と n-2 で呼んで足そう。デコレータは def の真上の行に書くよ。
期待する出力
55
📄 見本
「答えを見る」を押すと、お手本のコードが出ます。クリックでコピーできます。
💻 コードエディタ
実行すると結果がここに表示されます
正解!見本と同じになりました。
次へ →
🏠 ホームへ

れんしゅうもんだい

☑ 0 / 3 正解 レッスンに戻る

全問正解でクエストクリア!

未挑戦

問題 1: @lru_cache で fib(0)〜fib(5) をリストで表示しよう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
[0, 1, 1, 2, 3, 5]
未挑戦

問題 2: @lru_cache で factorial(5) を計算して表示しよう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
120
未挑戦

問題 3: @lru_cache で fib(20) を表示しよう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
6765
コピーしました!