[英]C#: Recursive functions with Lambdas
以下不編譯:
Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);
局部變量“fac”在訪問之前可能未初始化
你怎么能用 lambdas 做一個遞歸函數?
[更新]
這里還有兩個我覺得有趣的鏈接:
C# 不支持這種特殊風格的函數作為單行聲明。 您必須將聲明和定義分成兩行
Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);
那么geez,如果你只是輸入“為什么遞歸lambda導致明確的賦值錯誤?” 在一些搜索引擎中,你已經在我關於這個主題的文章中找到了答案。
:-)
您必須先創建fac
並稍后分配它(這非常不起作用,因為它依賴於多個分配)或使用所謂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));
}
但請注意,這可能有點難以閱讀/理解。
從 C# 7.0 開始,您終於可以通過使用本地函數而不是 lambda 來做類似的事情。
int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.