2014-01-23 2 views
1

재귀 꼬리 호출은 함수가 마지막 동작으로 자신을 호출 할 때 발생한다는 것을 알고 있습니다. 함수 호출이 마지막 줄에없는 경우에도 다음 코드는 꼬리 호출로 간주됩니까?꼬리 전화로 간주됩니까?

void test(int a) 
{ 
    if(a == 1) 
     return; 
    else if(a % 2 == 0) 
     test(a/2); 
    else 
     test(3 * a - 1); 
} 

말은 짝수이다. 전화 테스트 (a/2)는 꼬리 호출로 간주됩니까?

+1

'테스트'호출은 [꼬리 전화] (http://en.wikipedia.org/wiki/Tail_call) 위치에서 발생합니다. 기본적으로 * 마지막 액션으로 호출되는 모든 함수 * - 이것은 반환 값을 버리거나 즉시 반환해야 함을 의미합니다. [물론 이들은 void에 적용되지 않습니다.] - 꼬리 호출 위치에 있습니다. – user2864740

답변

2

예, C++에서는 그다지 의미가 없습니다. C++에서는 Tail 호출 제거가 필요하지 않습니다. 컴파일러는 때때로 그것을 할 수 있지만 꽤 자주하지 않을 것입니다. 당신은 Scheme에서 당신처럼 그것을 의지 할 수 없습니다.

+0

그러나 컴파일러가 테일 호출 제거를 수행하는 경우이 함수에 대해 수행해야합니다. – Barmar

+0

@Barmar : 조금 강하다. 꼬리 호출 최적화 기가 하나의 분기 및 하나의 꼬리 호출이있는 함수에서만 작동하는 것은 무리가 아닙니다. 문제는 TCO에 대한 기회를 인식하기 위해서는 일반적으로 지수 적으로 복잡한 흐름 분석이 필요하다는 것입니다. – MSalters