challenge 不動点演算子

不動点演算子とは、関数を引数に取り、その関数の不動点を返すような関数です。 つまり、不動点演算子である関数gが関数fを引数に取るとき、 f(g(f)) = g(f) となります。

お題は不動点演算子を実装することです。(Yコンビネータを実装しても結構ですが、それ以外でも、コンビネータになっていなくてもOKとします)

Posted feedbacks - Common Lisp

labels で無名再帰関数作りました。

こういうのは変数と関数の名前空間が分かれてると読みにくいですね。

1
2
3
4
5
6
7
8
(defun fix (f) (labels ((g (x) (funcall (funcall f #'g) x))) #'g))

(defun fib-maker (f)
  (lambda (x) 
    (if (<= x 2) 1 (+ (funcall f (1- x)) (funcall f (- x 2))))))

(let ((fib (fix #'fib-maker)))
  (mapcar fib '(1 2 3 4 5 6 7 8 9 10)))

Index

Feed

Other

Link

Pathtraq

loading...