C #: Funciones recursivas con Lambdas

El siguiente no comstack:

Func fac = n => (n <= 1) ? 1 : n * fac(n - 1); 

La variable local ‘fac’ podría no inicializarse antes de acceder

¿Cómo se puede hacer una función recursiva con lambdas?

[Actualizar]

Aquí también hay dos enlaces que me pareció interesante leer:

  1. “¿Por qué un lambda recursivo causa un error de asignación definido?”
  2. Recursividad anónima en C #

C # no admite este estilo particular de función como una statement de línea única. Tienes que separar la statement y la definición en 2 líneas

 Func fac = null; fac = n => (n <= 1) ? 1 : n * fac(n - 1); 

Bien, si hubieras escrito “¿por qué un lambda recursivo causa un error de asignación definido?” en algún buscador, hubieras encontrado la respuesta en mi artículo sobre el tema.

🙂

http://blogs.msdn.com/ericlippert/archive/2006/08/18/why-does-a-recursive-lambda-cause-a-definite-assignment-error.aspx

Tendrás que crear fac primero y luego asignarlo (lo cual es bastante unfuncional porque depende de múltiples asignaciones) o usar los llamados Y-combinators .

Ejemplo:

 delegate Func FixedPointFunction(Func f); static Func Fix(FixedPointFunction f) { return f(x => Fix(f)(x)); } static void Main(string[] args) { var fact = Fix(f => x => (x <= 1) ? x : x * f(x - 1)); Console.WriteLine(fact(5)); } 

Pero tenga en cuenta que esto puede ser algo difícil de leer / entender.

desde c # 7.0, finalmente puede hacer esto en una línea usando una función local

 int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);