4

Y-Combinatorを1時間理解しようとした後、ようやく理解できましたが、ほとんどの場合、それがなくても同じことが達成できることに気付きました...その目的を完全に理解しているかどうかはわかりませんが。

例えば。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())

別のラムダの関数への参照を持つことによる階乗

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

PythonでY-Combinatorの目的があるかどうか誰か教えてもらえますか?

4

2 に答える 2

8

Yコンビネータの目的は、無名関数のみを使用して任意の再帰関数を作成する方法を示すことです。しかし、これまでに発明されたほとんどすべての言語は、名前付き関数を許可します!言い換えれば、それは主に学術的な関心事です。もちろん、Pythonでは階乗をもっと「自然に」定義できます。

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

Yコンビネータが実際に役立つ言語は、Unlambdaのような「チューリング陥穷」言語だけです。Lisp / Schemaユーザーでさえ、実際のプログラムを作成するときに通常Yコンビネータを使用することはありません。

于 2012-02-19T09:19:53.573 に答える
3

Pythonはラムダ計算に基づいていません。このように質問をすると、あまり意味がありません。この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]

関数型言語から借用したため、このように名前が付けられていますが、コンビネータ論理を使用したコンピューティング用ではありません。

于 2012-02-19T09:21:25.510 に答える