C#:使用Lambdas的递归函数

以下不编译:

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

在访问之前,可能不会初始化局部变量’fac’

你怎么能用lambdas做一个递归函数?

[更新]

这里还有两个我觉得有趣的链接:

  1. Eric Lippert的“为什么递归lambda导致明确的赋值错误?”
  2. C#中的匿名递归

C#不支持这种特殊的函数样式作为单行声明。 您必须将声明和定义分成2行

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

那么geez,如果你只是输入“为什么递归lambda导致明确的赋值错误?” 在一些搜索引擎中,你已经在我关于这个主题的文章中找到了答案。

🙂

http://blogs.msdn.com/ericlippert/archive/2006/08/18/why-does-a-recursive-lambda-cause-a-definite-assignment-error.aspx

你必须首先创建fac并稍后再分配它(这非常不起作用,因为它取决于多个赋值)或者使用所谓的Y-combinators

例:

 delegate Func FixedPointFunction(Func f); static Func Fix(FixedPointFunction f) { return f(x => Fix(f)(x)); } static void Main(string[] args) { var fact = Fix(f => x => (x <= 1) ? x : x * f(x - 1)); Console.WriteLine(fact(5)); } 

但请注意,这可能有点难以阅读/理解。

从c#7.0开始,你最终可以使用本地函数在一行中完成此操作

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