¿Pueden las funciones lambda ser recursivas? [duplicado]

Posible duplicado:
funciones lambda recursivas en c++0x

Aquí hay una función recursiva simple y antigua:

int fak(int n)
{
    return (n <= 1) ? 1 : n * fak(n - 1);
}

¿Cómo escribiría una función recursiva como una función lambda?

[](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

¿Hay alguna expresión que denote la lambda actual para que pueda llamarse a sí misma recursivamente?

Respuestas:1 Respuesta 1
Tiempo:hace 9 años, 7 meses
Última modificación:hace 2 meses

Solución

Sí, pueden. A partir de C++23 puede usar el parámetro explícito:

auto factorial = [](this auto self, int i) 
{ 
    return (i == 1) ? 1 : i * self(i - 1); 
};

Con los estándares anteriores de C++, puede almacenar la lambda en una variable y hacer referencia a esa variable (aunque no puede declarar el tipo de esa variable como , tendría que usar un objeto en su lugar). Por ejemplo:autostd::function

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

Otras respuestas

Deja un comentario