Y-Combinator

(define Y
  (lambda (f)
    ((lambda (proc)
       (f (lambda (x y z)
            ((proc proc) x y z))))
     (lambda (proc)
       (f (lambda (x y z)
            ((proc proc) x y z)))))))
(define Ytarai
  (lambda (f)
    (lambda (x y z)
      (if (<= x y)
          y
          (f (f (- x 1) y z)
             (f (- y 1) z x)
             (f (- z 1) x y))))))
(define tarai
  (lambda (x y z)
    (if (<= x y)
        y
        (tarai (tarai (- x 1) y z)
               (tarai (- y 1) z x)
               (tarai (- z 1) x y)))))

を実行してみる。環境はPenM上のcolinuxという遅々なもの。

(tarai 12 6 0) ((Y Ytarai) 12 6 0) Ytarai/tarai
stalin 0.08 sec 0.13 sec 1.7
gosh 2.59 sec 35.9 sec 14

Ytarai/taraiの値に注目。Y-Combinatorの中まで解析していない(と思う)goshは14倍もの時間がかかっているが、中まで解析している(と思う)stalinは1.7倍の時間しかかかっていない。

〆。

14倍はちょっと辛いが、1.7倍くらいならハードウェアで埋められる。メモ化や何やらの都合を考えると常用してもよいかもしれないな。

追記

Pentium4の実機で動かしたらstalin-Ytaraiがcolinuxよりも遅くなった。何故?