【发布时间】:2011-12-01 07:41:53
【问题描述】:
我的大脑似乎处于自虐状态,所以在被this、this 和this 淹没后,它想在C# 中进行一些DIY。
我想出了以下内容,我不认为是 Y 组合子,但它确实似乎设法使非递归函数递归, 不引用自身:
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)));
【问题讨论】:
标签: c# dynamic functional-programming y-combinator