C#:使用Lambdas的递归函数

And*_*ech 27 c# recursion lambda factorial

以下不编译:

Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Run Code Online (Sandbox Code Playgroud)

在访问之前,可能不会初始化局部变量'fac'

你怎么能用lambdas做一个递归函数?

[更新]

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

  1. Eric Lippert的"为什么递归lambda导致明确的赋值错误?"
  2. C#中的匿名递归

Jar*_*Par 45

C#不支持这种特殊的函数样式作为单行声明.您必须将声明和定义分为2行

Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 15

那么geez,如果你只是输入"为什么递归lambda导致明确的赋值错误?" 在一些搜索引擎中,你已经在我关于这个主题的文章中找到了答案.

:-)

http://blogs.msdn.com/ericlippert/archive/2006/08/18/why-does-a-recursive-lambda-cause-a-definite-assignment-error.aspx

  • 所有的道路都通向Lippert:D优秀的职位. (4认同)
  • '如果你只是键入"为什么递归lambda导致明确的赋值错误?" 进入一些搜索引擎':-) (3认同)

Dar*_*rio 11

你必须先创建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));            
}
Run Code Online (Sandbox Code Playgroud)

但请注意,这可能有点难以阅读/理解.