2013-03-01 4 views
0

boost :: lambda는 을 재귀 적으로 사용할 수 있습니다?람다 재귀를 부스트합니까?

이 컴파일되지 않습니다 권장 해결 방법은

using namespace boost::lambda; 

auto factorial = (_1 == 0) ? 1 : factorial(_1-1); 

있습니까?

편집 : C++ 11 람다를 사용하여 관련하여 다음 VS2012에서 컴파일되지 않습니다 다음

std::function<int(int)> factorial; 
factorial = [&factorial](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); }; 

int main(int argc, char* argv[]) 
{ 
    int i = factorial(5); 
return 0; 
} 

ANOTHER 편집이 : 이상하게도,이 잘 작동 :

std::function<int(int)> factorial = 
    [&](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); }; 

int main(int argc, char* argv[]) 
{ 
    int i = factorial(5); 
return 0; 
} 
+1

C++ 11을 이미 사용하고 있다면'std :: function'과 내장 재귀 람다를 사용하지 않을까요? http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c0x –

+0

boost :: lambda는 msvc C++ 11 람다 구현보다 안정적이고 유연한 것 같습니다. –

+0

어떤 문제가 있습니까? 당신은 람다의 VC++ 구현을 경험하고 있습니까? 어떤 문제도 보지 않고 꽤 많이 사용했습니다 (어쨌든 SP1 이후로는 문제가 없습니다). – Ferruccio

답변

0

가장 간단한 방법 I 일반 C++ 11 람다에서 발견 된 것은 람다를 먼저 포함 할 변수를 선언 한 다음이를 정의하고 람다를 생성하는 것입니다. 이미 선언되었으므로 선언은/lambda 정의에 사용됩니다. 예 : 당신이 선언의 서명을 알아야 않고 내가 부스트 : : 람다와 함께 작동하는지 모르겠지만

std::function<int (int)> factorial = nullptr; 
factorial = [](int x) -> int { 
    if (x <= 1) { 
     return 1; 
    } else { 
     return (x * factorial(x-1)); 
    } 
}; 

지금까지 나는 것 (그 방법에 문제가 없었어요 그럴까요?).

+0

이것은 순환 적이 지 않습니다. 만약 당신이 그렇게한다면, 컴파일되지 않습니다. (VS2012에서) –

+0

예가 아닙니다, 제가 고칠 것입니다. 그것 (또는 아주 비슷한 것, 필자는 적절한 컴파일러 atm에 대한 액세스 권한이 없음)이 가장 확실하게 컴파일되므로 자주 사용합니다. – ssube

1

람다 함수는 이름이 없으므로 직접 호출 할 수 없습니다.

해결 방법은 간단합니다. 이름이 지정된 함수를 사용하십시오.

+0

전적으로 사실이 아닙니다 - 람다 함수 포인터의 기본 주소를 얻으려면 * 이론적으로 * 적절한 유형으로 캐스팅 한 다음 재귀 적으로 호출 할 수 있습니다. 아마도 비용은 들지 않을 것입니다. –