C#基于Lambda递归的阶乘/累加实现

  http://www.cnblogs.com/tiscs/archive/2012/02/09/csharp-lambda-recursion.html 

前天做一道面试题,要我用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< intint> factorial = RFunc< intint>((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用的不多,不知道如何添加静态字段/方法,如果有知道的希望不吝赐教。

人活着就要有他自己的意义,否则他就和死了没什么两样!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值