05/06/07 17:54:02
もうちょっとだけ、Cで
245を書いて、247を読んで、ちょっと考えてやっと気づいたんですけど
この問題の本質って、実はめちゃめちゃ簡単ですね
LISPのコードで書かれてる段階では全く気づかなかったんですけど
Cで書いて、読んでみたら、やっと気づきました
必要になるかどうか分からない関数値は、
事前に計算しないで引数のまま渡す
タダそれだけですね
int tarai(int x, int y, int z);
int tarai_sub(int x, int y, int z_x, int z_y, int z_z) {
if (x > y) {
int z = tarai(z_x, z_y, z_z);
return tarai_sub(tarai(x-1,y,z), tarai(y-1,z,x), z-1, x, y);
}
return y;
}
int tarai(int x, int y, int z) { return tarai_sub(x, y, z, z, 0); }
このコードなら、Cに疎いLISPerの方々でも余裕で理解できるでしょう
なんかこう、高度なというか表現力や抽象化能力の高い道具が
問題の本質を逆に隠してしまっていたような、そんな気がします