2009-07-03 255 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));    
} 

但是請注意,這可能是有點難以讀取/理解。