2011-01-06 39 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