1 2 3 4 5 6 7 8 | public delegate TFunction RecursiveLambda<TFunction>(Func<TFunction> self); public delegate TFunction RecursiveOperator<TFunction>(RecursiveOperator<TFunction> self); public static TFunction Y<TFunction>(RecursiveLambda<TFunction> lambda) { RecursiveOperator<TFunction> f = self => lambda(() => self(self)); return f(f); } |
跟函数参数个数无关的YCombinator的做法,简洁易懂,铿锵有力,下面是调用的例子(一个参数的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | static void Main( string [] args) { // 可以递归自己的lambda表达式做出来的斐波那契数列 var fib = Y<Func< int , int >>(self => i => { if (i <= 2) { return 1; } else { return self()(i - 1) + self()(i - 2); } }); for ( int i = 1; i <= 10; i++) { Console.WriteLine( "Fib({0}) = {1}" , i, fib(i)); } } |