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:
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.
:-)
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);