C #: Las funciones recursivas con Lambdas
Pregunta
La continuación no se compila:
Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);
'fac' La variable local podría no ser inicializado antes de acceder a
¿Cómo se puede hacer una función recursiva con lambdas?
[Actualización]
Aquí hay también dos enlaces que he encontrado interesante leer:
Solución
Este estilo particular de la función no está soportada por C # como una sola declaración de línea. Hay que separar a cabo la declaración y definición en 2 líneas
Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Otros consejos
Bueno, vaya, si lo acaba de escribir "¿por qué un lambda recursiva causar un error de asignación definitiva?" en algunos motores de búsqueda, usted ha encontrado la respuesta en mi artículo sobre el tema.
: -)
Vas a tener que crear fac
primera und asignar más tarde (que es bastante unfunctional porque depende de la asignación múltiple) o utilizar 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));
}
Sin embargo, tenga en cuenta que esto podría ser un poco difícil de leer / entender.
ya que c # 7.0 que finalmente puede hacer esto en una línea usando un función local
int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);