C#基於Lambda遞歸的階乘/累加實現


  前天做一道面試題,要我用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用的不多,不知道如何添加靜態字段/方法,如果有知道的希望不吝賜教。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM