以下内容无法编译:

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

访问之前,本地变量“ FAC”可能不会初始化

如何使用 lambda 来创建递归函数?

[更新]

这里还有两个我觉得有趣的链接:

  1. Eric Lippert 的“为什么递归 lambda 会导致明确的赋值错误?”
  2. C# 中的匿名递归
有帮助吗?

解决方案

C# 不支持这种特殊风格的函数作为单行声明。您必须将声明和定义分成两行

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

其他提示

好吧,如果您刚刚键入“为什么递归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 你终于 使用 a 在一行中执行此操作 局部功能

int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top