>>249 > なんかこう、高度なというか表現力や抽象化能力の高い道具が > 問題の本質を逆に隠してしまっていたような、そんな気がします そんなことないよ。>>220 の labels を分解して (defun tarai (x y z) (labels ((tarai-1 (x y fz) (if (<= x y) y (tarai-2 x y (funcall fz)))) (tarai-2 (x y z) (if (<= x y) y (tarai-1 (tarai-2 (1- x) y z) (tarai-2 (1- y) z x) (lambda () (tarai-2 (1- z) x y)))))) (tarai-2 x y z))) tarai-1 をインライン展開して (defun tarai (x y z) (labels ((tarai-2 (x y z) (if (<= x y) y (let ((xx (tarai-2 (1- x) y z)) (yy (tarai-2 (1- y) z x))) (if (<= xx yy) yy (tarai-2 xx yy (funcall (lambda () (tarai-2 (1- z) x y))))))))) (tarai-2 x y z)))
まとめると (defun tarai (x y z) (if (<= x y) y (let ((xx (tarai (1- x) y z)) (yy (tarai (1- y) z x))) (if (<= xx yy) yy (tarai xx yy (tarai (1- z) x y)))))) それを C にすると int tarai(int x, int y, int z) { for (;;) { if (x <= y) return y; int xx = tarai(x - 1, y, z), yy = tarai(y - 1, z, x); if (xx <= yy) return yy; z = tarai(z - 1, x, y); x = xx; y = yy; } } こうなるんだけど、>>249 よりシンプルだし速度も倍。