Reputation: 107950
The below does not compile:
Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Local variable 'fac' might not be initialized before accessing
How can you make a recursive function with lambdas?
[Update]
Here are also two links that I found interesting to read:
Upvotes: 29
Views: 8795
Reputation: 2685
Since C# 7.0 you finally can do a similar thing by using a local function instead of a lambda.
int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);
Upvotes: -1
Reputation: 49218
You'll have to create fac
first und assign it later (which is pretty unfunctional because it depends on multiple assignment) or use so called Y-combinators
.
Example:
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));
}
But note that this might be somewhat hard to read/understand.
Upvotes: 12
Reputation: 754715
This particular style of function is not supported by C# as a single line declaration. You have to separate out the declaration and definition into 2 lines
Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Upvotes: 50