Могут ли лямбда-функции быть рекурсивными?
Возможный дубликат:
Рекурсивные лямбда-функции в С++ 0x
Вот простая старая рекурсивная функция:
int fak(int n)
{
return (n <= 1) ? 1 : n * fak(n - 1);
}
Как написать такую рекурсивную функцию, как лямбда-функцию?
[](int n) { return (n <= 1) ? 1 : n * operator()(n - 1); }
// error: operator() not defined
[](int n) { return (n <= 1) ? 1 : n * (*this)(n - 1); }
// error: this wasn't captured for this lambda function
Есть ли какое-либо выражение, которое обозначает текущую лямбда, чтобы он мог называть себя рекурсивно?
Ответы
Ответ 1
Да, они могут. Вы можете сохранить его в переменной и ссылаться на эту переменную (хотя вы не можете объявить тип этой переменной как auto
, вместо этого вам придется использовать объект std::function
). Например:
std::function<int (int)> factorial = [&] (int i)
{
return (i == 1) ? 1 : i * factorial(i - 1);
};
В противном случае нет, вы не можете ссылаться на указатель this
внутри тела лямбда.