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

関数のメンバ変数なんて変なものを使っているから、これはこれでなんか微妙だけどね。 ま、それでもかなりシンプルになっている、はず。

ちなみに、これを使ってもほとんど速度は向上しません。 ま、関数呼び出しの回数は変わってないどころか増えてるから、仕方ないね。

メモリ消費量は減る、かな?

そんな事より大事なのは、再帰回数の制限を超えられること。 何千回回そうとも止まらずに動いてくれる。素晴らしい。

言語仕様そのものに組み込まれたりすると、処理速度も向上したりするんだろうけれどねー。 どうっすか、偉い人?