2011-01-06 3 views
27

Возможно ли рекурсия с делегатом Func? У меня есть следующий, который не компилируется, поскольку имя Func не в рамках ...Рекурсия с Func

Func<long, long, List<long>, IEnumerable<long>> GeneratePrimesRecursively = (number, upperBound, primeFactors) => 
{ 
    if (upperBound < number) 
    { 
     return primeFactors; 
    } 
    else 
    { 
     if (!primeFactors.Any(factor => number % factor == 0)) primeFactors.Add(number); 
     return GeneratePrimesRecursively(++number, upperBound, primeFactors); // breaks here. 
    } 
}; 
+0

Это работает из коробки на Mono http://www.ienablemuch.com/2010/11/simulate-nested-recursive-function-in-c_08.html –

+0

Это дубликат http://stackoverflow.com/questions/1079164/c-recursive-functions-with-lambdas/1079609#1079609 –

ответ

45

Как это:

Func<...> method = null; 
method = (...) => { 
    return method(); 
}; 

Ваш код выдает ошибку, потому что вы пытаясь использовать переменную, прежде чем назначать ее.
Ваше лямбда-выражение скомпилировано до того, как переменная установлена ​​(переменная может быть установлена ​​только в полное выражение), поэтому она не может использовать переменную.
Установка этой переменной на null сначала позволяет избежать этой проблемы, поскольку она уже будет установлена ​​при компиляции лямбда-выражения.

Как более мощный подход, вы можете использовать YCombinator.

+0

+1 Для работы. Я действительно хочу, чтобы C# был «умным», чтобы работать без этой конструкции. (С другой стороны, некоторые языки имеют различный синтаксис для функций и привязок рекурсивных функций.) –

+0

@pst: см. Мои расширенные объяснения. – SLaks

+0

Это красивая ловкость рук, отлично работает! – t3rse

Смежные вопросы