Мой мозг, кажется, находится в мазохистском режиме, поэтому после того, как я утонул в этом , this и this , он хотел возиться с некоторыми DIY на C #.
Я придумал следующее, которое я не думаю, что является Y-комбинатором, но он действительно , кажется, может сделать рекурсивную нерекурсивную функцию без ссылаясь на себя:
Func, Func> Y = x => x(x);
Итак, учитывая эти:
Func> fact =
self => n => n == 0 ? 1 : n * self(self)(n - 1);
Func> fib =
self => n => n < 2 ? n : self(self)(n-1) + self(self)(n-2);
Мы можем сгенерировать эти:
Func Fact = Y(fact);
Func Fib = Y(fib);
Enumerable.Range(0, 10)
.ToList()
.ForEach(i => Console.WriteLine("Fact({0})={1}", i, Fact(i)));
Enumerable.Range(0, 10)
.ToList()
.ForEach(i => Console.WriteLine("Fib({0})={1}", i, Fib(i)));