Domanda

Il seguito non compila:

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

'fac' variabile locale potrebbe non essere   inizializzato prima di accedere

Come si può fare una funzione ricorsiva con lambda?

[Aggiornamento]

Qui ci sono anche due link che ho trovato interessante leggere:

  1. Eric Lippert di "Perché un lambda ricorsiva causare un errore di assegnazione definitiva?"
  2. Anonymous ricorsione in C #
È stato utile?

Soluzione

Questo particolare stile di funzione non è supportata da C # come una singola dichiarazione di linea. Bisogna separare la dichiarazione e la definizione in 2 linee

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

Altri suggerimenti

Bene Accidenti, se solo digitato "perché un lambda ricorsiva causare un errore di assegnazione definitiva?" in qualche motore di ricerca, avresti trovato la risposta nel mio articolo sul tema.

: -)

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

Dovrai creare fac primo und assegnare in un secondo momento (che è abbastanza unfunctional perché dipende assegnazione multipla) o di utilizzare i cosiddetti Y-combinators .

Esempio:

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));            
}

Ma si noti che questo potrebbe essere un po 'difficile da leggere / capire.

dal c # 7.0 finalmente possono fare questo in una linea utilizzando un funzione locale

int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top