簡體   English   中英

C#:使用 Lambda 的遞歸函數

[英]C#: Recursive functions with Lambdas

以下不編譯:

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

局部變量“fac”在訪問之前可能未初始化

你怎么能用 lambdas 做一個遞歸函數?

[更新]

這里還有兩個我覺得有趣的鏈接:

  1. Eric Lippert 的“為什么遞歸 lambda 會導致明確的賦值錯誤?”
  2. C#中的匿名遞歸

C# 不支持這種特殊風格的函數作為單行聲明。 您必須將聲明和定義分成兩行

Func<int, int> 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<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM