■
昨日の物(http://www.kmonos.net/wlog/52.php#_0212050903)は 継承を使うのが一番自然と気づいたので追加。
template fix(T){alias T fix;} class memo(T):T{ int memo[int]; int opCall(int a){ int*p = a in memo; return !p?memo[a] = super.opCall(a):*p; } } class fib{ int opCall(int n){ if(n<=1)return 1; return opCall(n-1)+opCall(n-2); } } int main(){ fib f; f = new memo!(fib); for(int i=0;i<33;++i)printf("%d\n",f(i)); printf("\n"); f = new fix!(fib); for(int i=0;i<33;++i)printf("%d\n",f(i)); return 0; }
継承を使うと非常に意図が分かりやすくなったが、面白みのないコードになった。
memoが型決め打ちなのはtemplateを駆使すれば回避できる気もするが面倒なのでパス