lambda - 仅具有 lambda 表达式的阶乘函数

标签 lambda scheme

仅使用 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/

相关文章:

方案分配

scheme - 连续传球风格中的 ANF 转换

scheme - 如何在引用变量之前测试变量是否已定义?

types - Scheme 中类型的确切术语

scheme - 有没有办法从 Racket 中返回 `(values 1 2 3)` 的函数访问第 n 个返回值?

lambda - Lambda微积分将如何加数字?

c++ - 在 lambda 中使用类模板参数时出现编译错误

c++ - 仔细检查锁定模式 - 在传递给 call_once 的 lambda 中捕获

c# - 修改动态属性选择器 Lambda

java - 为什么这个 Java lambda 表达式参数有错误?