2010-02-19 2 views
3

this fiasco question에 토론에 참여한 후 전체 커뮤니티에서 질문을 제기하고 싶습니다.The Definitive Tail-Call Recursion Question

. 꼬리표 최적화를 .Net 기반 코드에 적용하는 시나리오는 무엇입니까?

답변을 신뢰할 수 있고 최신 소스 또는 재현 가능한 실험으로 지원하십시오.

+0

에릭 리 퍼트, 어디 있니? – SLaks

+3

정확히 무엇을 찾으십니까? 진실 또는 대중적인 응답? 후자 만 사용할 수 있습니다. –

+0

증거에 대한 그의 요청 ("믿을만한 최신 자료 또는 재현 가능한 실험")은 그가 "진실"을 찾고 있음을 암시하는 것처럼 보입니다. NET 컴파일러와 CLR이 실제로 결정적이기 때문에 그의 질문은 당신이 SO에 대해 어떻게 생각 하든지 관계없이 유효합니다. 누구든지 그 진실을 밝힐 수 있는지 여부는 여전히 공중에 있습니다. – jball

답변

4

Don Syme 등이 작성한 "Expert F #"에 따르면 F #은 테일 호출 최적화를 수행합니다. Eric Lippert의 블로그에서 C# 컴파일러 (모든 버전)가 읽지 않는다는 것을 기억하는 것 같습니다. 내가 틀렸다면 정정 해줘, 에릭. 모든 경우에 마지막 명령이 메서드를 호출 할 때 꼬리 호출 최적화를 수행 할 수 있습니다. 이것은 종종 메서드 자체의 재귀 호출이지만 필요하지는 않습니다. 현재 스택 프레임이 더 이상 필요하지 않다는 것을 보장하므로 최적화를 수행 할 수 있습니다. 그러나 간단한 조작 만 수행 한 후에는 최적화를 수행 할 수 없습니다.

int Fib(int n) 
{ 
    if(n < 2) 
    return 1; 

    return Fib(n-1) + Fib(n-2); 
} 

+Fib 반환 마지막 호출하기 전에 평가 될 수 없기 때문에 꼬리 호출이 최적화 될 수 없습니다. (사실 나는이 하나에뿐만 아니라 전문가 F #으로 확인 사용의 예라고 생각합니다.)이 버전은 모든 인수가 평가되기 때문에 최적화 된 꼬리 호출

int Fib(int n, int a, int b) 
{ 
    if(n == 0) 
    return a+b; 
    return Fib(n-1,a+b,a); 
} 

될 수 FIB 마지막 호출하기 전에 현재 스택 프레임을 버릴 수 있으므로 호출 후에 수행 할 작업이 없습니다.