C#: Recursive functions with Lambdas

前端 未结 4 670
死守一世寂寞
死守一世寂寞 2020-12-01 04:34

The below does not compile:

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

Local variable \'fac\' migh

相关标签:
4条回答
  • 2020-12-01 04:59

    Well geez, if you'd just typed "why does a recursive lambda cause a definite assignment error?" into some search engine, you'd have found the answer in my article on the subject.

    :-)

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

    0 讨论(0)
  • 2020-12-01 05:02

    You'll have to create fac first und assign it later (which is pretty unfunctional because it depends on multiple assignment) or use so called Y-combinators.

    Example:

    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));            
    }
    

    But note that this might be somewhat hard to read/understand.

    0 讨论(0)
  • 2020-12-01 05:10

    This particular style of function is not supported by C# as a single line declaration. You have to separate out the declaration and definition into 2 lines

    Func<int, int> fac = null;
    fac = n => (n <= 1) ? 1 : n * fac(n - 1);
    
    0 讨论(0)
  • 2020-12-01 05:14

    since c# 7.0 you finally can do this in one line using a local function

    int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);
    
    0 讨论(0)
提交回复
热议问题