테일 콜 최적화와의 큰 문제가 무엇인지, 파이썬이 필요한 이유를 설명하십시오.

StackOverflow https://stackoverflow.com/questions/890461

문제

따라서 파이썬이 꼬리 통화 최적화가 필요한지 여부에 대한 큰 Brouhaha가있었습니다. 누군가가 누군가가 머리에왔다 Guido를 배송했습니다. SICP 사본 그는 "그것을 얻지 못했기 때문에" 나는 Guido와 같은 보트에 있습니다. 테일 콜 최적화의 개념을 이해합니다. 파이썬이 정말로 어떤 이유도 있다고 생각할 수 없습니다. 필요합니다 그것.

이것을 쉽게 이해하기 위해 누군가가 TCO를 사용하여 크게 단순화 할 코드 스 니펫을 줄 수 있습니까?

도움이 되었습니까?

해결책

개인적으로, 나는 꼬리 통화 최적화에 큰 가치를 부여합니다. 그러나 주로 반복만큼 효율적으로 재귀를 만들기 때문입니다 (또는 반복을 재귀의 서브 세트로 만들기 때문에). 최소한의 언어에서는 성능을 희생하지 않고 큰 표현력을 얻습니다.

'실용적인'언어 (Python과 같은)에서 Otoh는 일반적으로 상상할 수있는 거의 모든 상황에 대한 다른 많은 구성을 가지고 있으므로 덜 중요합니다. 물론 예상치 못한 상황을 허용하기 위해 항상 좋은 일입니다.

다른 팁

대안으로 루프로 표현 될 수있는 것들에 대한 재귀를 강렬하게 사용하려면 "테일 콜 최적화"가 실제로 필수입니다. 그러나 Python의 자비로운 독재자 (BDFL) 인 Guido는 루프가 루프로 표현되는 것을 강력하게 믿습니다. 따라서 그는 스틱 트레이스 덤프를 희생시키고 규칙적으로 디버깅)로 가지 않을 것입니다.

꼬리 통화 최적화 스택 오버플로에 대해 걱정하지 않고 재귀 함수를 쉽게 작성할 수 있습니다.

def fac(n, result=1):
        if n > 1:
                return fac(n - 1, n * result)
        return result

꼬리 통화 최적화가 없으면 큰 숫자로 이것을 호출하면 스택이 넘쳐납니다.

나는 몇 년 동안 당신의 질문에 대해 생각해 왔습니다 (믿거 나 말거나 ...). 나는이 질문에 너무 깊은 투자를해서 마침내 전체 기사를 썼습니다 (이것은 몇 달 전에 쓴 모듈 중 하나의 프레젠테이션이기도합니다. 여전히 그 질문에 관심이 있다면 내 답변을 읽으십시오. 블로그. 두 단어로, 나는 TCO 기준 치수; 당신은 꼬리 추방 제거 없이는 아직 할 수없는 일을 찾지 못할 것이지만, 그것에 대한 나의 생각에 관심이있을 수 있습니다.

나는 단순한 링크가 stackoverflow에서 선호하는 사용법이 아니라는 것을 알고 있습니다. 그러나이 게시물에 대한 답변을 위해 전체 기사를 썼다는 것을 고려하십시오 (내 기사 본문에서 언급)를 설명하기위한 사진도 포함합니다. 이런 이유로, 나는이 특이한 대답을 여기에 게시합니다.

Guido는 후속 조치에서 인식했습니다 게시하다 이 TCO는 기능 모음이 서로를 재귀 적으로 호출 할 때 스테이트 머신의 구현을 깨끗하게 허용했습니다. 그러나 동일한 게시물에서 그는 TCO가없는 대안 동일하게 더 깨끗한 솔루션을 제안합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top