引き続き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
かなり顕著な差がついた。