Мой мозг, кажется, находится в мазохистском режиме, поэтому после утопления в this, this и this, он хотел пообщаться с некоторыми DIY на С#.
Я придумал следующее, что я не думаю, это Y-combinator, но, похоже, ему удается сделать нерекурсивную функцию рекурсивной, не ссылаясь на себя:
Func<Func<dynamic, dynamic>, Func<dynamic, dynamic>> Y = x => x(x);
Итак, учитывая эти:
Func<dynamic, Func<dynamic, dynamic>> fact =
self => n => n == 0 ? 1 : n * self(self)(n - 1);
Func<dynamic, Func<dynamic, dynamic>> fib =
self => n => n < 2 ? n : self(self)(n-1) + self(self)(n-2);
Мы можем сгенерировать их:
Func<dynamic, dynamic> Fact = Y(fact);
Func<dynamic, dynamic> 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)));