2012-02-19 9 views
4

Y-Combinatorを理解しようとした1時間後...ついにそれを得ましたが、それ以外は同じことが実現できることに気付きました...私はそれが目的を完全に理解しているかどうかは分かりません。PythonはY-Combinatorを必要としませんか?

例えば、 PythonでY-Combinatorのための目的がある場合は、別のラムダに

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

を関数への参照をhaveingによって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()) 

階乗は誰も教えてくださいことはできますか?

+1

重要なことは、再帰と反復のパターンについて考え、認識するようにあなたの心を育てることです。これは、高階関数を使用する必要がある場合に役立ちます。また、高次関数が有用なときに認識するのに役立ちます。 – Marcin

答えて

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] 

を、それが結合論理とコンピューティングのためではありません。

関連する問題