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