.net에 TailCall opcode가 있으므로 은 F # 함수가 실제로 꼬리 재귀이면 deterime을 사용할 수 있습니까?F # 함수가 꼬리 재귀로 간주 될 수 있습니까? TailCall .net opcode를 사용합니다.
사실이라면 누구나 꼬리 및 비 꼬리 기능을 식별하는 VS 추가 기능을 만들었습니까?
.net에 TailCall opcode가 있으므로 은 F # 함수가 실제로 꼬리 재귀이면 deterime을 사용할 수 있습니까?F # 함수가 꼬리 재귀로 간주 될 수 있습니까? TailCall .net opcode를 사용합니다.
사실이라면 누구나 꼬리 및 비 꼬리 기능을 식별하는 VS 추가 기능을 만들었습니까?
F # 팀 블로그의 this blog post에서 F #이 꼬리 호출을 컴파일하는 방법에 대한 요약을 볼 수 있습니다. 한마디로
,그러나 모든 자세한 내용은 전체 게시물을 참조하십시오.
좋은 답변, 게시물을 읽어보십시오. 마지막에 "이 정보가 도움이 되었기를 바랍니다. 다음 게시물은이 게시물에서 다루는 제한 사항 중 일부를 해결하는 방법을 다룰 것입니다." 다음 게시물은 어디에 있을까요? –
@GuyCoder - 좋은 질문입니다. 우리가 타입 제공자 작업을 더 많이하기 시작하면서 그것은 뒤 버너에 붙어 있었지만, 나는 그것을 끝내려고 노력할 것입니다. – kvb
다음 게시글에서이 문제에 대해 이야기 해 주실 수 있습니까? http://blogs.msdn.com/b/jomo_fisher/archive/2007/09/24/adventures-in-f-corecursion.aspx –
그렇습니다. 컴파일러가 tail
호출 명령어를 내보내는 경우 해당 호출은 꼬리 재귀적일 수 있습니다 (CLR 4 에서처럼 일부 예외가 있지만 실제로는 꼬리 재귀가되지 않습니다). 그러나 이것이 반드시 전체 함수가 꼬리 재귀라는 것을 의미하지는 않습니다. 예를 들어, QuickSort 함수가 컴파일되어 첫 번째 재귀 호출이 꼬리 재귀가 아니고 두 번째 재귀 호출이 아니라는 것을 알 수 있습니다.
또한 일부 기능에는 tail
명령어가 포함되어 있지 않기 때문에 꼭 꼬리 재귀가 아니라는 것을 의미하지는 않습니다. JIT 컴파일러는 tail
명령어가 없어도 테일 호출을 인식하고 최적화합니다.
또한 F # 컴파일러는 재귀 함수를 비 재귀 적 방식으로 컴파일합니다. 이것은 일반 테일 호출 최적화와 다소 다르며 tail
명령어는 사용되지 않지만 전체 효과는 비슷합니다.
어떤 경우에는 F # 컴파일러가'.tail' 명령어를 사용하지 않고'goto'와 유사한 재귀 케이스를 변환합니다 - 이것이 어렵다는 것을 감지하면 –
왜 이것을 원하니? – Brian
@Brain : 함수가 꼬리 재귀 적이라는 것을 알고 싶습니까? 그렇다면보다 효율적인 코드를 작성하는 데 도움이됩니다. 꼬리 재귀 적으로 최적화 된 것을 만든 다음 하나의 잘못된 변경으로 꼬리 재귀를 전혀 만들지 않으면 즉각적인 피드백과 같을 것입니다. 이것을 이렇게 생각하십시오. 프로덕션 환경에서 테일 재귀 (tail recursive) 코드를 사용하면 약간의 변경을 가하면 꼬리 재귀가 아닙니다. 생산에 들어가고 갑자기 스택 오버 플로우가 시작됩니다. 당신은 그것이 오는 것을 결코 보지 못했습니다. –