2012-02-19 10 views
4

Y-Combinator를 이해하려고 한 시간이 흐른 후 ... 마침내 얻었습니다.하지만 대부분은 깨닫지 못했지만 똑같은 것을 얻을 수 있다는 것을 깨달았습니다. .파이썬에는 Y-Combinator가 필요하지 않습니까?

예 : 파이썬에서 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 결합 자의 목적은 익명 함수 만 사용하여 임의의 재귀 함수를 작성하는 방법을 시연하는 것입니다. 그러나 발명 된 거의 모든 언어가 명명 된 함수를 허용합니다! 다른 말로하면, 그것은 주로 학문적 관심사입니다. 물론, 당신은 파이썬에서 훨씬 더 "자연스럽게"계승을 정의 할 수 있습니다

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

는 Y 콤비 연습에서 실제로 유용하는 유일한 언어 Unlambda처럼 "튜링 소위 늪 (tarpit)"언어입니다. Lisp/Scheme 사용자조차도 실제 프로그램을 작성할 때 일반적으로 Y 결합자를 사용하지 않습니다.

3

파이썬은 람다 미적분을 기반으로하지 않습니다. 이런 식으로 질문을하면 이해가되지 않습니다. 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] 

을하지만, 조합 적 논리와 컴퓨팅 아닙니다.

관련 문제