【发布时间】:2011-03-05 19:35:19
【问题描述】:
仅使用 lambda 表达式,您可以自己创建的最透明、最优雅的阶乘函数是什么?
我的一个学生在伯克利上了一堂 Scheme 课,并获得了这个额外的学分问题,即仅使用 lambda 表达式(没有定义、让或其他幂过程)创建阶乘函数。我花了一段时间才解决,又复杂又丑。
几年后,我现在正在教 Scheme,我意识到我要把它作为对自己的挑战,并认为其他人也会喜欢它。
【问题讨论】:
-
你可以使用数字吗?布尔值(
if或cond)? -
是否允许将
let和/或let*用作((lambda成语的缩写?这不会简化问题,但会使生成的代码更清晰。 -
好问题。必须允许“if”和“cond”,否则在停止条件下不会停止。同意 let 和 let* 是 lambda 语法糖。我正在寻找一个优雅的尾递归简约解决方案。你总是可以同时做这两个;我想我也会。命名为 let 和 letrec 肯定已经淘汰了。
-
您是否正在寻找一个将
lets 和defines 转换为lambdas 的普通阶乘函数? -
这里有一个更难的挑战:不使用 if、cond 或数字。将数字 0 表示为 (lambda (f x) x),数字 1 表示为 (lambda (f x) (f x)),数字 2 表示为 (lambda (f x) (f (f x))),通常数字 ' n'作为消耗'f'和'x'并将'f'应用于'x''n'次的函数。这些被称为“教会数字”。在这个系统中,您可以在没有任何 if、cond、数字等的情况下实现“阶乘”。只需 lambda、函数调用和变量 refs。如果您已经熟悉这个(一组)问题,我们深表歉意。