Q: 「Pythonで階乗を求める(これはひどい)」はYコンビネータ? A: いいえ。 再帰呼び出しは普通、以下のように関数が自分自身の名前を使って自分自身を呼び出します。 >>> f = lambda n: n and n * f(n - 1) or 1 >>> f(5) 120 ここで、名前をつけずに、関数自体にも手を加えずに、再帰呼び出しを実現するための手段がYコンビネータです。再帰呼び出しを実現するだけならばYコンビネータは必須ではありません。 前回のコードはYコンビネータを使わずに再帰呼び出しをしています。具体的には、元の関数をnだけを受け取るのではなく、自分自身も引数fに受け取るようにし、また再帰呼び出しでfを呼び出す際にも引数にfを渡してやるようにしています。 Yコンビネータ版は以下。 >>> Y = lambda f:((lambda g: f(lambda x: g(g)