ToDo:
http://blog.goo.ne.jp/no_orz_no_life/e/e7110098e80d89e28082065d32e9dd6b
の fact とか sum を見てて、 あらなんで3つ式あるのかなーと一瞬思ったんだけど、 まあたぶん末尾再帰の最適化かけたいという話だと思う。
で、そういえば GCC はどのくらい無茶なものを 末尾再帰にしてくれるのかなーとか思って色々やってみたら、 どうもすごく単純な足し算掛け算くらいしかできないぽかった。
まぁそんなもんかーと GCC を見ると、
if (act->add && !a_acc) a_acc = create_tailcall_accumulator ("add_acc", first, integer_zero_node);
if (act->mult && !m_acc) m_acc = create_tailcall_accumulator ("mult_acc", first, integer_one_node);
とかあって、やはり足し算と掛け算だけ特殊処理されてるのかな、 って感じだった。
関数型言語系だと、末尾が cons だった場合なんかにも、 似たような処理をしてやれば ずいぶんと色々とラクになるんじゃないかなぁとか思った。
あと、足し算掛け算以外を色々考えてる間に書いた、
def factdiv(n) if n==1 1.0 else n/factdiv(n-1) end end
というような関数は、 つまり (2*4*8*...)/(1*3*5*...) という感じの値を返すわけだけど、 この値は 1.25 sqrt(N) くらいの数字になるみたいだった。 正確には (1*3*5*7*...)/(2*4*6*...) になってる時は 0.8 sqrt(N) くらいになってるので、この二つを繰り返すというか。
さてこれってなんか今まで見たことあるっけ… どうも見たことない気がするんだけど、 なんか有名な法則とかがありそうではある。
(23:39)
年越す時に書いてたコードは spoj のゴルフだと思う。 たぶん kamil 。 spoj のゴルフはなんかよくわからんくらい短いものが結構あって、 なんか答え埋め込みとかになってるやつもあるのかなぁ。
年明けてからは BF_PRIME で、正月早々 Brainfuck ってのもどうなんですかね… しかもどうも勝てる気配があまりなくてですね…
kinaba さんの書いておられた、 なんかに特化した言語作るってのはいいかもなぁと思ったので、 Brainfuck の短いコードを出力するプログラムに特化した言語というのはどうか…
去年は今一つ、色んなことに慣れすぎてて特に何も無かったなぁ…という感じがした。 そいうことを思いながらはてなとか見てみた。
とかあったんですが、このへんは知ってることまとめたりとかそういうのばっかで、 今一つ新鮮なことではなくて。
というわけで自分的に一番重要だったことは wake は今年作ったんだなぁということな気がする。
あとまぁ後半は Starcraft2 やってたなぁとしか言えないんじゃないかね。
(23:57)
前 | 2011年 1月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。
factdiv(N)/sqrt(N)はNが偶数だとsqrt(PI/2) = 1.253..にNが奇数だとsqrt(2/PI) = 0.797..に収束します。ウォリスの公式と言います。
足し算掛け算は a+(b+c) (普通の再帰)を (a+b)+c (末尾再帰)に変えて問題ないけど、cons は cons(a,cons(b,c)) は cons(cons(a,b),c) にすると意味というか型が違ってしまうのでしんどい面も。破壊的なappendができる言語ならそれに変えればなんとかなるかもですが
> ウォリスの公式
おおおありがとうございます。こいうのがあるんですね。例のごとく三角関数やら円周率が登場するわけですね…
> cons
あーはい、なんとなく append に変えちゃうイメージで考えてました。たぶん f に対して f(a,f(b,c))==g(g(a,b),c) を満たす g があればいいって話ですよね。引き算とかなら(需要はないだろうけど) f(a,b)=a-b に対して g(a,b)=-a+b みたいな。
除算とか考えたのも非対称なヤツについて考えてみないとなーという感じで考えたのでした。