2009-07-03 196 views
27

递归函数以下不会编译:C#:与Lambda表达式

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

局部变量“FAC”可能不会 访问

之前,你怎么能与一个递归函数初始化lambda表达式?

[更新]

这里还有两个环节,我发现有趣的阅读:

  1. Eric Lippert's "Why does a recursive lambda cause a definite assignment error?"
  2. Anonymous Recursion in C#
+2

你真的想这样做在同一行?这看起来像一个噩梦的可维护性和理解... – Ian 2009-07-03 12:36:15

+0

好吧,也许只是一个概念 – 2009-07-03 12:37:01

回答

45

的功能,这种特殊的风格是不支持由C#作为单行声明。你必须声明和定义分离成2线

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

你必须创建fac第一UND以后分配给它(这是相当非功能,因为它取决于多种分配),或者使用所谓的Y-combinators

例子:

delegate Func<TIn, TOut> FixedPointFunction<TIn, TOut>(Func<TIn, TOut> f); 

static Func<T, TRes> Fix<T, TRes>(FixedPointFunction<T, TRes> f) { 
    return f(x => Fix(f)(x)); 
} 

static void Main(string[] args) { 

    var fact = Fix<int, int>(f => x => (x <= 1) ? x : x * f(x - 1)); 

    Console.WriteLine(fact(5));    
} 

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