이의 내가 여기에이 코드가 있다고 가정 해 봅시다 반환되었습니다. 그러나 이것이 꼬리 재귀이고 적절하게 최적화된다는 것을 인식 할 것인가? 중첩 된 구조로 인해 구조를 인식 할 수 없게 될 수도 있습니다.얼랑 핸들의 경우 문이 꼬리 재귀와 혼합 않는 방법
답변
예, 그렇습니다. 얼랭 (Erlang)은 꼬리 호출을 최적화하는 데 필요하며 함수가 호출 된 후에는 아무 일도 일어나지 않기 때문에 이것은 분명히 꼬리 호출입니다.
나는 Erlang에 tailcall
키워드가 있었으면 좋겠다. 그래서 컴파일러는 잘못된 사용법에 대해 경고 할 수 있었지만 그때 익숙해졌다.
나는 Erlang에 새로 왔지만 내가 모은 것에서 규칙은 tail-recursive가되기 위해 함수는 주어진 논리 분기에서 두 가지 중 하나를 수행해야한다고 생각한다.
- 는 재귀 호출
- 반환 재귀 호출의 가치를 확인하고 이후에 다른 아무것도 할 수 없습니다 그것을
재귀 호출은 당신이 원하는만큼 if
, case
, 또는 receive
전화로 중첩 될 수 만큼 오래. 실제로 그 후에 일어나는 일이 있습니다.
이것은 재귀 함수가 컴파일러에 의해 최적화되었는지 어떻게 알 수 있는지 물어 보는 것과 관련이 있다고 생각합니다. 목록을 사용하지 않으므로 reverse/1이 적용되지 않을 수도 있지만 동일한 질문을 가진 다른 사람에게는 다른 코드 예제와의 관련성이 매우 높습니다. R12B 이후 릴리스에서 얼랑 효율성 가이드
는 내가 빼앗아 메시지가 가장 될 것입니다 무엇을보고 어떤 경우에 측정 할 수 있다는 것을 생각합니다.에서 얼랑 성능의 여덟 신화에서
많은 의 경우 단어의 수는 스택에 을 사용 감소합니다 최적화가 본문 재귀 호출에서는 이므로 본문 재귀 목록 함수 과 을 호출하는 꼬리 재귀 함수는 다음과 같이 나열합니다. 역순/1은 끝에 정확히 동일한 양의 메모리를 사용합니다.
http://www.erlang.org/doc/efficiency_guide/myths.html#id58884
예, 꼬리 재귀입니다. 주의해야 할 주된 점은 예외가 발생한 경우입니다. 이 경우, 때로는 예외가 스택에 살아야 할 필요가 있습니다. 그러면 뭔가 꼬리 재귀 적으로 보이는 것을 무의미하게 만듭니다.
통화가 테일 포지션에있는 경우 꼬리 통화 최적화가 적용됩니다. 꼬리 위치는 "함수가 돌아 오기 전에 마지막 것"입니다.
fact(0) -> 1;
fact(N) -> N * fact(N-1).
에 사실 재귀 호출이 있습니다 하지 꼬리 위치에 fact(N-1)
계산 한 후, 당신은 계속 N * _
(즉, N
곱) 실행해야하기 때문이다.
- 1. 꼬리 재귀와 피보나치
- 2. 꼬리 재귀와 스카 이즈 약속
- 3. 문이 작동하지 않는 경우
- 4. else 문이 작동하지 않는 경우!
- 5. 자바 스크립트 문이 참으로 평가되지 않는 경우
- 6. 문이 끊어진 경우
- 7. SQL 문이 실패한 경우 스크립트를 결정하는 방법
- 8. 꼬리()
- 9. 값이 0 일 때 if 문이 작동하지 않는 경우 (PHP)
- 10. Windows 프로 시저 메시지에 대해 Else 문이 작동하지 않는 경우
- 11. 얼랑 - 인터리브 쉬운 방법
- 12. 얼랑 -
- 13. SlidingDrawer 핸들의 위치는?
- 14. 올바르게 구문 분석 문이 경우 ANTLR
- 15. 재귀와 프롤로그에서의 추가 사용
- 16. 얼랑 패턴
- 17. if 문이 실행되지 않는 이유는 무엇입니까?
- 18. PHP Ifelse 문이 참이 아닌 경우
- 19. 레코드를 다시 계산하지 않은 경우 커서 문이 실행되지 않도록하는 방법
- 20. Xcode - 문이 UILabel을 계속 표시하는 경우
- 21. 스칼라 및 꼬리 재귀
- 22. 준비된 문이 여러 개 포함 된 경우
- 23. 테이블에있는 문이 값이있는 함수 인 경우
- 24. return을 따르는 경우 finally 문이 실행됩니까?
- 25. 얼랑 생산
- 26. 목록에서 얼랑
- 27. 얼랑 gen_server
- 28. 휴대용 얼랑
- 29. 학습 얼랑
- 30. 얼랑 노드
+1. ** 증명 가능한 ** 꼬리 재귀적인 논리의 경우 Erlang은 언어 정의에 따라 최적화합니다. –
'tailcall'은 정말 끔찍한 아이디어이기 때문에 익숙해서 다행입니다. –