RosettaCodeData/Task/Y-combinator/C-sharp/y-combinator-11.cs
2020-02-17 23:21:07 -08:00

23 lines
601 B
C#

using System;
delegate int Func(int i);
delegate Func FuncFunc(Func f);
delegate Func RecursiveFunc(RecursiveFunc f);
static class Program {
static void Main() {
var fac = Y(almost_fac);
var fib = Y(almost_fib);
Console.WriteLine("fac(10) = " + fac(10));
Console.WriteLine("fib(10) = " + fib(10));
}
static Func Y(FuncFunc f) {
RecursiveFunc g = r => f(x => r(r)(x));
return g(g);
}
static Func almost_fac(Func f) => x => x <= 1 ? 1 : x * f(x - 1);
static Func almost_fib(Func f) => x => x <= 2 ? 1 : f(x - 1) + f(x - 2);
}