对于编程了解或熟悉的人,对于函数的调用一定不会陌生。
(define (fact n)
(if (= n 1)
1
(* n (fact (- n 1)))))
(fact 5); //120
((lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(if (= k 1)
1
(* k (ft ft (- k 1)))))))
5)
F =
(lambda (f)
(lambda (n)
(if (< n 2)
1
(* n (f (- n 1))))))
上述是一个柯里化函数,当我们传递函数f给F的时候,由于f是不动点,F(f)=f,那么,上述要计算f,也就是计算出F的真正的不动点。
(define Y
(lambda (f)
(let ((g (lambda (h)
(lambda (x) ((f (h h)) x)))))
(g g))))
验证:使Y作用于上述F可得:
(let ((f (Y (lambda (h)
(lambda (n)
(if (< n 2) 1 (* n (h (- n 1)))))))))
(display (f 5)))
//120
分析如下:
(define f
(lambda (n)
(if (< n 2)
1
(* n (f (- n 1))))))
2、重复传入递归函数本身,避免自身引用的问题
(let ((g (lambda (h n)
(if (< n 2) 1 (* n (h h (- n 1)))))))
(g g 10)
3、将上面的函数柯里化,转换为下面的函数。
(let ((g (lambda (h)
(lambda (n)
(if (< n 2) 1 (* n ((h h) (- n 1))))))))
((g g) 10))
4、将上面的函数转换为下面的样子。
(let ((g (lambda (h)
(lambda (n)
(let ((f (lambda (q n)
(if (< n 2) 1 (* n (q (- n 1)))))))
(f (h h) n))))))
(display ((g g) 10)))
5、再柯里化一遍。
(let ((g (lambda (h)
(lambda (n)
(let ((f (lambda (q)
(lambda (n)
(if (< n 2) 1 (* n (q (- n 1))))))))
((f (h h)) n))))))
(display ((g g) 10)))
上述获得Y算子。
本文来自网易实践者社区,经作者王海玲授权发布。