약 8 억 번 호출해야하는 재귀 함수 (C#의 경우)가 있습니다. 이것은 분명히 일반적으로 약 900 번째 호출 후에 스택 오버 플로우를 발생시킵니다. 이 루프를 여러 개의 루프로 쫓아 냈지만 재귀 패턴은 훨씬 쉽고 유지 보수가 간편합니다.재귀 함수, 스택 오버플로 및 Y 결합 자
저는 y-combinator를 사용하여 재귀 함수를 구현하는 방법을 살펴보고 있습니다. 스택 결합 오버플로 문제를 해결하고 다중 중첩 루프를 해결해야한다는 것을 알고 있습니다.
누구나 y-combinator를 사용해 본 경험이 있습니까? 스택 오버플로가 계속 붙어 있을까요?
계승의 간단한 예를 들어보십시오. 5,000보다 큰 숫자의 계승 (factorialial)은 스택 오버플로를 유발합니다. 그 시나리오에서 y-combinator를 올바르게 사용했다면 스택 오버플로를 수정하겠습니까?
구현하기가 쉽지 않으므로 y 조합자를 구현하고 학습하는 개발 노력/리소스를 사용하기 전에이를 확인하고 싶습니다.
불행히도, 아니, C#을 사용하고 있으며 3 개의 개별 모음을 반복하며 각각 2 ~ 3 개의 내부 모음을 생성하므로 작은 함수만으로도 동일한 함수의 8 개의 다른 버전을 호출해야합니다. 그들 사이에 다양합니다. 필자는 재귀 적으로 호출하는 하나의 함수 (여전히 거의 120 행)로 다시 작성할 수 있지만 꼬리 재귀는 호출하지 않으므로 호출이 900 번째 호출에서 왜 폭격을 일으켰습니다. –
.NET 4.0 이후로 C#이 적절한 꼬리 재귀를 지원함을 이해합니다. [.NET Framework 4의 테일 호출 개선] (http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/tail -call-improvements-in-net-framework-4.aspx) 및 [C# 및 F #의 꼬리 재귀] (http://lookingsharp.wordpress.com/2010/03/08/tail-recursion-in-csharp-and -fsharp /). 모든 CPU를 컴파일하고 64 비트 머신에서 프로그램을 실행할 때 확실히 꼬리 재귀 최적화를 수행합니다 - 만약 도움이된다면 ... –
@SaschaHennig : 감사합니다. –