resueltos recursivo recursividad maximo juego ejercicios ejemplo divisor concepto comun algoritmos algoritmo c# recursion lambda factorial

c# - recursivo - juego de recursividad



C#: Funciones recursivas con Lambdas (4)

El siguiente no compila:

Func<int, int> 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 declaración de línea única. Tienes que separar la declaración y la definición en 2 líneas

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


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<TIn, TOut> FixedPointFunction<TIn, TOut>(Func<TIn, TOut> f); static Func<T, TRes> Fix<T, TRes>(FixedPointFunction<T, TRes> f) { return f(x => Fix(f)(x)); } static void Main(string[] args) { var fact = Fix<int, int>(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);