内部構造を弄りすぎだ、俺。外部へのインターフェースは変えていないから、影響はそれほど無いのだけれど。明らかに今までの考えが根本から間違っていましたといってるようなものだよなあ。
でもやっつけでいいからプロトタイプをさっさと仕上げないと、何だか永久に使えそうにない気がする。
もしかしたら俺は、行動を起こす前に一秒以上考えちゃいけない人なのかもしれんね。
一秒も考えずに書くけど(っていうか今までだってろくすっぽ考えずに書いてきたけど)、俺ってプログラムを公開するためにサイトを開設したのか、それともサイトの運営で楽をするためにプログラムを書いて公開しているのか時々わからなくなる。
多分俺の中にぼんやりとした目的があって、なんだかそれがよくわからないからプログラムを書いてみたり文章を書いて、それでブートストラップな感じで本来のまだ言語化出来ないでいる目的へ漸近的に近付いているのだろう。
それでその目的だけど、それは暇潰しなのではないかと思うときがある。もっとも人生の目的が暇潰しとも言えるだろうから、これは正解といえるのかどうかは自身無いけど。
もしかしたら俺は、いわゆる本末転倒をひたすら繰り返しているだけなんじゃないのかとかちょっと恐ろしいことを考えたりもするのだけれど、それはそれで暇潰しにはなるから問題ないか。
関数のメモ化って奴があるんだと。
とりあえずPythonで書いてみた。
def fix(G):
memo = {}
def f(x):
try:
return memo[x]
except:
memo[x] = f(x)
return memo[x]
f = G(f)
return f
def fib_maker(f):
def _x(x):
if x <= 1:
return 1
else:
return f(x-1)+f(x-2)
return _x
def fib2(x):
if x<=1:
return 1
else:
return f(x-1)+f(x-2)
メモ化するととてつもなくパフォーマンスがあがって驚く。流石は計算結果のキャッシュ。
でもこれだと、いきなりfib(30)を計算するよりも順番に計算させた方が速いってことになる。そういうものなのかなあ。
オマケ。クラスを使って計算結果をキャッシュという本題からずれた実装。
class Fib:
def __init__(self):
self.memo = {}
def __call__(self, x):
try:
return self.memo[x]
except:
self.memo[x] = self.fib(x)
return self.memo[x]
def fib(self, x):
if x <= 1:
return 1
else:
return self(x-1)+self(x-2)
追記(2005-09-02):Pythonでメモ化でもっとずっとまともな実装がされていた。
さらに追記(2005-09-03):memorize with decoratorではPython2.4から導入されたdecoratorでメモ化をしている。これは格好いいな。