Реализовал ли я Y-комбинатор, используя динамический C #, и если нет, то что это?

Мой мозг, кажется, находится в мазохистском режиме, поэтому после того, как я утонул в этом , 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)));

14
задан Benjol 6 October 2011 в 04:49
поделиться