2011-03-24 2 views

답변

16

예, 그렇습니다. 얼랭 (Erlang)은 꼬리 호출을 최적화하는 데 필요하며 함수가 호출 된 후에는 아무 일도 일어나지 않기 때문에 이것은 분명히 꼬리 호출입니다.

나는 Erlang에 tailcall 키워드가 있었으면 좋겠다. 그래서 컴파일러는 잘못된 사용법에 대해 경고 할 수 있었지만 그때 익숙해졌다.

+1

+1. ** 증명 가능한 ** 꼬리 재귀적인 논리의 경우 Erlang은 언어 정의에 따라 최적화합니다. –

+0

'tailcall'은 정말 끔찍한 아이디어이기 때문에 익숙해서 다행입니다. –

-1

나는 Erlang에 새로 왔지만 내가 모은 것에서 규칙은 tail-recursive가되기 위해 함수는 주어진 논리 분기에서 두 가지 중 하나를 수행해야한다고 생각한다.

  • 는 재귀 호출
  • 반환 재귀 호출의 가치를 확인하고 이후에 다른 아무것도 할 수 없습니다 그것을

재귀 호출은 당신이 원하는만큼 if, case, 또는 receive 전화로 중첩 될 수 만큼 오래. 실제로 그 후에 일어나는 일이 있습니다.

2

이것은 재귀 함수가 컴파일러에 의해 최적화되었는지 어떻게 알 수 있는지 물어 보는 것과 관련이 있다고 생각합니다. 목록을 사용하지 않으므로 reverse/1이 적용되지 않을 수도 있지만 동일한 질문을 가진 다른 사람에게는 다른 코드 예제와의 관련성이 매우 높습니다. R12B 이후 릴리스에서 얼랑 효율성 가이드

에서 얼랑 성능의 여덟 신화에서

많은 의 경우 단어의 수는 스택에 을 사용 감소합니다 최적화가 본문 재귀 호출에서는 이므로 본문 재귀 목록 함수 과 을 호출하는 꼬리 재귀 함수는 다음과 같이 나열합니다. 역순/1은 끝에 정확히 동일한 양의 메모리를 사용합니다.

http://www.erlang.org/doc/efficiency_guide/myths.html#id58884

는 내가 빼앗아 메시지가 가장 될 것입니다 무엇을보고 어떤 경우에 측정 할 수 있다는 것을 생각합니다.

2

예, 꼬리 재귀입니다. 주의해야 할 주된 점은 예외가 발생한 경우입니다. 이 경우, 때로는 예외가 스택에 살아야 할 필요가 있습니다. 그러면 뭔가 꼬리 재귀 적으로 보이는 것을 무의미하게 만듭니다.

통화가 테일 포지션에있는 경우 꼬리 통화 최적화가 적용됩니다. 꼬리 위치는 "함수가 돌아 오기 전에 마지막 것"입니다.

fact(0) -> 1; 
fact(N) -> N * fact(N-1). 

에 사실 재귀 호출이 있습니다 하지 꼬리 위치에 fact(N-1) 계산 한 후, 당신은 계속 N * _ (즉, N 곱) 실행해야하기 때문이다.