2008-11-20
http://www.kmonos.net/wlog/52.php#_0308050827
を写経
int delegate(int) fib_maker(int delegate(int) f) { return (int n){return n <= 1 ? 1 : f(n-1) + f(n-2);}; } int delegate(int) fix(int delegate(int) function(int delegate(int)) g) { int delegate(int) f; f = (int n){return f(n);}; f = g(f); return f; } int delegate(int) fix_memo(int delegate(int) function(int delegate(int)) g) { int delegate(int) f; int[int] memo; f = (int n){return n in memo ? memo[n] : (memo[n] = f(n));}; f = g(f); return f; } void main(){ auto fib = fix(&fib_maker); for( int i=0 ; i!=31 ; ++i ) writefln(fib(i)); auto fib_memo = fix_memo(&fib_maker); for( int i=0 ; i!=31 ; ++i ) writefln(fib_memo(i)); }
写経するだけでも苦労した。