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:

  1. Eric Lippert de "¿Por qué una lambda recursiva causar un error de asignación definitiva?"
  2. Anónimo recursividad en C #
¿Fue útil?

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.

: -)

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

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top