メモ化 (Memoize)
このメモ化(Memoize)の話、そういえば去年の夏くらいにはやったなー。 当時はもひとつ理解できんかったけど。
taks = {}
def tak (x, y, z):
global taks
if x <= y:
return y
else:
if not taks.has_key((x,y,z)):
taks[(x,y,z)] = tak(tak(x - 1, y, z),
tak(y - 1, z, x),
tak(z - 1, x, y))
return taks[(x,y,z)
を見てやっとどういう概念か理解できた。まぁ実現方法は色々あるみたいだけど。 で、一言で言うと、:
同じ引数を渡した場合には必ず同じ返値を返す関数(純粋関数)の場合、毎回時間の 掛かる演算をするのではなくて計算結果をキャッシュ(メモ)しておいて再利用 しましょう
ということなんだね。
以下は、今回メモ化を理解する際に参考にしたエントリです。
- Memoise
- [結] 2005年8月 - 結城浩の日記: Perl版の「メモ化(memoization), 再帰関数定義関数, 最小不動点」
- Pythonでメモ化 @ NISHIO HIROKAZU # Archived COREBlog
class Memorize:
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
if self.cache.has_key(args):
return self.cache[args]
result = self.func(*args)
self.cache[args] = result
return result
fib = Memorize(fib)
print fib(5)
1| def memoize(func):
2| cache = {}
3| def cached_func(*args):
4| if cache.has_key(args):
5| return cache[args]
6| result = func(*args)
7| cache[args] = result
8| return result
9| return cached_func
10|
11| @memoize
12| def fib(n):
13| print "fib(%d) was called." % n
14| if n == 0 or n == 1:
15| return 1
16| else:
17| return fib(n - 1) + fib(n - 2)
18|
19| print fib(5)
20| print fib(8)
入門Haskell
まだ「ふつうのHaskell」を読み終わってないのに、昨日本屋に寄ったら 「入門Haskell」が売ってたので、思わず買ってしまった。
|
入門Haskell―はじめて学ぶ関数型言語 |
にあった、
「入門Haskell」にあって「ふつうのHaskellプログラミング」に(足り)ないのはなにか? 愛、である。
が気になったので。
最初のほうだけぱらぱら読んだけどさすがに一番最初にこちらを読んでたら わけわからんかっただろうな。ちゃんと読むのはふつうのHaskellを読み終わってから。

