用Func递归

t3r*_*rse 27 c# recursion primes

是否可以使用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.
    }
};
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 50

像这样:

Func<...> method = null;
method = (...) => {
    return method();
};
Run Code Online (Sandbox Code Playgroud)

您的代码会产生错误,因为您在分配变量之前尝试使用该变量.
您的lambda表达式是在设置变量之前编译的(该变量只能设置为完整的表达式),因此它不能使用该变量.
将变量设置为nullfirst可以避免此问题,因为在编译lambda表达式时已经设置了它.

作为一种更强大的方法,您可以使用YCombinator.

  • @SLaks,@ pst:pst在这里有正确的想法,但细节不太正确.这个*可能是合法的原因是因为我们可以在编译时推断*执行lambda主体在写入之前无法读取变量"method".我们可以知道这一点,因为静态分析可以显示初始化不会调用lambda.基本上我们需要做的是告诉编译器,引用匿名方法的委托构造函数不会调用它.因此我们可以抑制明确的分配错误. (2认同)