Рекурсия с Func - PullRequest
       29

Рекурсия с Func

27 голосов
/ 06 января 2011

Можно ли сделать рекурсию с делегатом 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.
    }
};

1 Ответ

49 голосов
/ 06 января 2011

Как это:

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

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

В качестве более мощного подхода вы можете использовать YCombinator .

...