Ответ 1
Этот особый стиль функции не поддерживается С# как однострочное объявление. Вы должны выделить объявление и определение в 2 строки
Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Ниже не компилируется:
Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Локальная переменная 'fac' может не быть инициализируется перед доступом к
Как вы можете сделать рекурсивную функцию с lambdas?
[Обновление]
Здесь также две ссылки, которые мне было интересно прочитать:
Этот особый стиль функции не поддерживается С# как однострочное объявление. Вы должны выделить объявление и определение в 2 строки
Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Ну, ну, если бы вы просто набрали "почему рекурсивная лямбда выдает определенную ошибку присваивания?" в какую-то поисковую систему, вы бы нашли ответ в моей статье по этому вопросу.
: -)
Вам нужно будет создать fac
сначала и назначить его позже (что довольно бесполезно, потому что оно зависит от множественного назначения) или использовать так называемый Y-combinators
.
Пример:
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));
}
Но обратите внимание, что это может быть трудно читать/понимать.