Python是否不需要Y-Combinator?

4

尝试一个小时后,我终于理解了Y-Combinator,但是我意识到可以不用它实现相同的功能...虽然我不确定是否完全理解它的目的。

例如,使用Y-Combinator计算阶乘

print (lambda h: (lambda f:f(f))(lambda f: h(lambda n: f(f)(n))))(lambda g: lambda n: n and n * g(n-1) or 1)(input())

通过在另一个lambda中引用函数来计算阶乘。
print (lambda f,m:f(f,m))((lambda g,n: n and n * g(g,n-1) or 1),input())

请问在Python中,Y-Combinator有何用途?


1
最重要的是,它训练你的思维去思考和识别递归和迭代的模式。这将有助于你使用高阶函数,并帮助你识别它们何时有用。 - Marcin
2个回答

8
Y组合子的目的是演示如何仅使用匿名函数编写任意递归函数。但是,几乎所有已发明的语言都允许命名函数!换句话说,它主要是学术上的兴趣。当然,在Python中可以更自然地定义阶乘:
def fac(n):
    return n * fac(n-1) if n else 1

实际上,Y组合子只在“图灵沼泽”语言(如Unlambda)中才有实际用途。即使是Lisp/Scheme用户在编写真实程序时也通常不会使用Y组合子。


3

Python并不是基于Lambda演算的,如果你这样提问的话并没有太多意义。 lambda表达式只是一种方便的功能,用于创建匿名函数:

>>> list( map(lambda x: x**2, [1, 2, 3, 4, 5]) )
[1, 4, 9, 16, 25]

#    the same as:

>>> def sq(x):
...     return x**2
...
>>> list( map(sq, [1, 2, 3, 4, 5]) )
[1, 4, 9, 16, 25]

它被这样命名是因为它借鉴了函数式语言的思想,但它并不用于计算组合逻辑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接