引き続きY Combinator

竹内関数をY Combinator による実装と、素直な実装でベンチマーク

(define tak
  (Y 
   (lambda (f-tak)
     (lambda (x y z)
       (cond ((> x y)
	      (f-tak (f-tak (- x 1) y z)
		     (f-tak (- y 1) z x)
		     (f-tak (- z 1) x y)))
	     (else y))))))

(define (r-tak x y z)
  (cond ((> x y)
	 (r-tak (r-tak (- x 1) y z)
		(r-tak (- y 1) z x)
		(r-tak (- z 1) x y)))
	(else y)))

gosh> (time (r-tak 12 6 0))
;(time (r-tak 12 6 0))
; real   2.156
; user   2.125
; sys    0.000
12
gosh> (time (tak 12 6 0))
;(time (tak 12 6 0))
; real  31.984
; user  27.109
; sys    4.828
12

かなり顕著な差がついた。