前天做一道面试题,要我用C#实现累加,想用Lambda写,结果面试官急匆匆地过来,Timeout了,可能是面试官的午饭时间到了吧。
今天补上吧,温习一下,下次写的要快点。
首先分享一个递归帮助类,写这个类的时候参考了老赵和装配脑袋的博客,在此表示感谢。这个类的实现思路很简单,将包含算法描述Lambda当作参数传递并调用。
下面的代码就是几个这个帮助类实现的,为了方便在微博上发布,压缩了一下代码。
压缩代码 using System;class c{static Func<Func<Func<int,int>,int,int>,Func<int, int>> rf=f=>x=>f(rf(f),x);static Func<int,int> r=rf((f,n)=>n==1?1:n*f(n-1));static void Main(string[] args){Console.Write(r(4);}}
原始代码
1
using System;
2
3 class Program
4 {
5 /// <summary>
6 /// 单参数有返回值递归方法生成器。
7 /// </summary>
8 /// <typeparam name="T"> 单参数方法参数类型。 </typeparam>
9 /// <typeparam name="TResult"> 方法返回值类型。 </typeparam>
10 /// <param name="f"> 递归运算描述方法。 </param>
11 /// <returns> 生成器生成递归方法。 </returns>
12 static Func<T, TResult> RFunc<T, TResult>(Func<Func<T, TResult>, T, TResult> f)
13 {
14 return x => f(RFunc(f), x);
15 }
16
17 /// <summary>
18 /// 阶乘方法实现。
19 /// </summary>
20 static Func< int, int> factorial = RFunc< int, int>((f, n) => n == 1 ? 1 : n * f(n - 1));
21
22 /// <summary>
23 /// 程序入口点。
24 /// </summary>
25 /// <param name="args"> 命令行参数列表。 </param>
26 public static void Main( string[] args)
27 {
28 Console.Write(factorial( 4));
29 }
30 }
2
3 class Program
4 {
5 /// <summary>
6 /// 单参数有返回值递归方法生成器。
7 /// </summary>
8 /// <typeparam name="T"> 单参数方法参数类型。 </typeparam>
9 /// <typeparam name="TResult"> 方法返回值类型。 </typeparam>
10 /// <param name="f"> 递归运算描述方法。 </param>
11 /// <returns> 生成器生成递归方法。 </returns>
12 static Func<T, TResult> RFunc<T, TResult>(Func<Func<T, TResult>, T, TResult> f)
13 {
14 return x => f(RFunc(f), x);
15 }
16
17 /// <summary>
18 /// 阶乘方法实现。
19 /// </summary>
20 static Func< int, int> factorial = RFunc< int, int>((f, n) => n == 1 ? 1 : n * f(n - 1));
21
22 /// <summary>
23 /// 程序入口点。
24 /// </summary>
25 /// <param name="args"> 命令行参数列表。 </param>
26 public static void Main( string[] args)
27 {
28 Console.Write(factorial( 4));
29 }
30 }
C#中,如果方法定义中调用了方法本身,是非法的,除非用静态方法,如果没有这个限制,就可以写成一句话递归,不知道园友们有没有办法。
有一个思路,就用dynamic动态构造一个包含RFunc静态方法的类,但我dynamic用的不多,不知道如何添加静态字段/方法,如果有知道的希望不吝赐教。