C #: funzioni ricorsive con Lambda
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:
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.
: -)
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);