经过一个小时的尝试了解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的目的吗?
答案 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]
它以这种方式命名,因为它是从函数式语言中借用的,但它不适用于具有组合逻辑的计算。