나는 꼬리 - 재귀를 만들고 싶습니다 재귀 함수가 있습니다. 내 실제 문제는보다 복잡하고 상황에 따라 다릅니다. 그러나 내가 풀어보고 싶은 문제는 다음과 같은 단순한 프로그램으로 증명됩니다.꼬리 - 재귀 객체와 함께
#include <iostream>
struct obj
{
int n;
operator int&() { return n; }
};
int tail(obj n)
{
return tail(obj{ n + 1 > 1000 ? n - 1000 : n + 1 });
}
int main()
{
tail(obj{ 1 });
}
이것은 꼬리 재귀라는 것은 당연한 것 같습니다. 그러나 언제든지 obj n
의 소멸자가 호출되어야하기 때문에 그렇지 않습니다. 적어도 MSVC13 (편집 : 및 MSVC15)은 이것을 최적화하지 않습니다. obj
을 int로 바꾸고 그에 따라 호출을 변경하면 예상대로 꼬리 재귀가됩니다.
내 실제 질문은 다음과 같습니다. obj
을 int
으로 바꾸는 것 외에이 꼬리 재귀를 만드는 쉬운 방법이 있습니까? 성능 이점을 목표로하고 있으므로 힙 할당 메모리와 new
을 가지고 노는 것이 도움이되지 않을 가능성이 큽니다.
쉬운 방법 : 더 나은 컴파일러를 얻으십시오. 여러분의 컴파일러는 오래되었습니다. –
msvc15가 실행되지 않습니다. – IceFire
이 꼬리 재귀가 어떻게 종료 되길 기대합니까? –