仅使用 lambda 表达式,您可以自己创建的最透明、最优雅的阶乘函数是什么?
我的一个学生在伯克利上了一门 Scheme 类(class),并获得了这个额外的学分问题,即仅使用 lambda 表达式(没有定义、让或其他幂过程)创建阶乘函数。我花了一段时间来解决,而且很复杂和丑陋。
几年后,我现在正在教 Scheme,我意识到我要把它设置为对自己的挑战,并认为其他人也可能会欣赏它。
最佳答案
这是一个( curry )版本:
((lambda (x) (x x))
(lambda (fact-gen)
(lambda (n)
(if (zero? n)
1
(* n ((fact-gen fact-gen) (sub1 n)))))))
尾递归版本:
(let ((fact-gen
(lambda (fact-gen n acc)
(if (zero? n)
acc
(fact-gen fact-gen (sub1 n) (* n acc))))))
(lambda (n) (fact-gen fact-gen n 1)))
关于教会数字:
(let* ((one (lambda (s z) (s z)))
(add1 (lambda (n) (lambda (s z) (s (n s z)))))
(* (lambda (a b) (lambda (s z) (a (lambda (z2) (b s z2)) z))))
(cons (lambda (a b) (lambda (f) (f a b)))))
(lambda (n)
((n (lambda (p)
(p (lambda (count acc)
(cons (add1 count) (* count acc)))))
(cons one one))
(lambda (a b) b))))
关于lambda - 仅具有 lambda 表达式的阶乘函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206266/