2011-01-06 59 views
27

使用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 – 2011-01-06 04:10:16

+0

这是http:///stackoverflow.com/questions/1079164/c-recursive-functions-with-lambdas/1079609#1079609 – 2011-01-06 16:31:25

回答

45

像这样:

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

,因为你是你的代码产生一个错误在分配它之前尝试使用该变量。
您的lambda表达式在变量设置之前编译(该变量只能设置为完整的表达式),因此它不能使用该变量。
首先将变量设置为null可以避免这个问题,因为在编译lambda表达式时它已经被设置。

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