Подтвердить что ты не робот

С#: рекурсивные функции с Lambdas

Ниже не компилируется:

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

Локальная переменная 'fac' может не быть инициализируется перед доступом к

Как вы можете сделать рекурсивную функцию с lambdas?

[Обновление]

Здесь также две ссылки, которые мне было интересно прочитать:

4b9b3361

Ответ 1

Этот особый стиль функции не поддерживается С# как однострочное объявление. Вы должны выделить объявление и определение в 2 строки

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

Ответ 3

Вам нужно будет создать 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));            
}

Но обратите внимание, что это может быть трудно читать/понимать.