Python不需要Y-Combinator吗?

时间:2012-02-19 09:08:24

标签: python recursion lambda y-combinator self-reference

经过一个小时的尝试了解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的目的吗?

2 个答案:

答案 0 :(得分:8)

Y组合器的目的是演示如何仅使用匿名函数编写任意递归函数。但几乎所有发明的语言都允许命名函数!换句话说,它主要是学术兴趣。当然,你可以更多地定义阶乘法"当然"在Python中:

def fac(n):
    return n * fac(n-1) if n else 1

Y组合器在实践中实际有用的唯一语言是"图灵的tarpit"语言,如Unlambda。在编写真实程序时,Lisp / Scheme用户通常不会使用Y组合器。

答案 1 :(得分: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]

它以这种方式命名,因为它是从函数式语言中借用的,但它不适用于具有组合逻辑的计算。