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

來源:互聯網
上載者:User

  前天做一道面試題,要我用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 }

   C#中,如果方法定義中調用了方法本身,是非法的,除非用靜態方法,如果沒有這個限制,就可以寫成一句話遞迴,不知道園友們有沒有辦法。

  有一個思路,就用dynamic動態構造一個包含RFunc靜態方法的類,但我dynamic用的不多,不知道如何添加靜態欄位/方法,如果有知道的希望不吝賜教。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.