Pythonで末尾再帰する
再帰っていいよね。なんか楽だ。
楽なんだけど、メモリとか時間とか食うのよね。 そこで末尾再帰・・・なんだけど、末尾再帰で書いても最適化されないんだよね、python。
それならば、と最適化するのをデコレータで実装しちゃった人が居るらしい。 メタプログラミングってやつだね。すごい。
New Tail Recursion Decorator (Python recipe) - ActiveState Code
Pythonのクロージャで末尾再帰最適化をする。 - tanihitoの日記
だんだん綺麗になってくのがいいっすね、素敵。
でもさ、まだ行けると思うんだ。 という訳で、更に手を入れてみました。
def tail_recursive(func):
from functools import wraps
@wraps(func)
def _tail(*args, **kwd):
_tail.__args = args
_tail.__kwd = kwd
if _tail.__firstcall:
_tail.__firstcall = False
result = func
try:
while result is func:
result = func(*_tail.__args, **_tail.__kwd)
finally:
_tail.__firstcall = True
return result
else:
return func
_tail.__firstcall = True
return _tail
関数のメンバ変数なんて変なものを使っているから、これはこれでなんか微妙だけどね。 ま、それでもかなりシンプルになっている、はず。
ちなみに、これを使ってもほとんど速度は向上しません。 ま、関数呼び出しの回数は変わってないどころか増えてるから、仕方ないね。
メモリ消費量は減る、かな?
そんな事より大事なのは、再帰回数の制限を超えられること。 何千回回そうとも止まらずに動いてくれる。素晴らしい。
言語仕様そのものに組み込まれたりすると、処理速度も向上したりするんだろうけれどねー。 どうっすか、偉い人?