c#擴充套件方法奇思妙用變態篇一:由Fibonacci數列引出“委託擴充套件”及“遞推遞迴委託”
先回顧一個數列的概念:按一定次序排列的一列 數 稱為數列...(請參見百度百科:數列)
幾個簡單的數列:
1, 1, 1, 1, 1, 1, 1... //數列1
0, 1, 2, 3, 4, 5, 6, 7... //數列2
0, 1, 4, 9, 16, 25, 36, 49... //數列3
通項公式的定義:數列的第n項與項的序數這間的關係,也就是數列生成演算法
上面幾個數列可表示為
An = F(n) = 1
An = F(n) = n
An = F(n) = n * n
有了數列和通項公式的定義,我們的任務就好描述了:
用最簡潔的程式碼描述通項公式,用最簡潔演算法生成數列的前N個數。
在此要求下,用常規程式碼是做不到簡潔的,這裡我們用lambda表示式描述通項公式:
public static Func<int, int> fun1 = n => 1;
//數列2 通項公式
public static Func<int, int> fun2 = n => n;
//數列3 通項公式
public static Func<int, int> fun3 = n => n * n;
lambda表示式是不是與數學公式很像啊!
再來看生成演算法,這裡用了一個不一般的擴充套件:
/// 生成佇列的前count項
///
/// 通項公式
/// 生成的數量
///
public static IEnumerable<int> GetSequence(this Func<int, int> func, int count)
{
for (int i = 0; i < count; i++) yield return func(i);
}
相信大家見的擴充套件大多針對類(object, string)、介面(IEnumerable
這個擴充套件就是標題中說的“委託擴充套件”,感覺很怪吧,很彆扭吧,很別管太多,看看怎麼呼叫吧:
{
int[] ints1 = fun1.GetSequence(10).ToArray(); //1, 1, 1, 1
int[] ints2 = fun2.GetSequence(10).ToArray(); //0, 1, 2, 3
int[] ints3 = fun3.GetSequence(10).ToArray(); ; //0, 1, 4, 9
}
自我感覺比較簡潔,而且將生成數列(GetSequence)與數列演算法(通項公式)分開,也達到了生成數列(GetSequence)的複用。
上面幾個數列比較簡單,現在來看Fibonacci,
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...
用圖形表示如下:
這個序列在大家學習c語言遞推遞迴時都接觸過,這個序列很神奇,請參看維基百科:斐波那契數列
它的通項公式是 An = F(n) = n n =0, 1
F(n-1) + F(n-2) n>1
注意:關於這數列有的是從n從0開始,有的是從1開始,這裡不計較。
遞推遞迴演算法如下,容易理解效率確很低!!
{
if (n > 1) return GetFibonacci(n - 1) + GetFibonacci(n - 2);
else return n;
}
本文是為了引出遞推遞迴委託,暫不是演算法的效率
下面就要大(改)變(形)態了。
不考慮 <1 的情況
與數學通項式對比一下,何其相似!這就是我們的“遞推遞迴委託”!
考慮所有情況,完成Fibonacci,如下
實在感嘆c#精簡的語法,一句程式碼可以表示一個遞推遞迴!
呼叫測試下吧!
{
//委託擴充套件方法 + 遞推遞迴委託
int[] fibonacciSequence = Fibonacci.GetSequence(12).ToArray();
}
當然這個生成演算法效率不是一般的低!
最後給出一個數學推匯出的精確演算法
//Pow擴充套件,簡化呼叫
public static double Pow(this double x, double y)
{
return Math.Pow(x, y);
}
一點意見:像這樣程式碼,最好是給封裝起來,否則會很麻煩的。
這篇文章是給極少數人看的(啟發一下),看完後封裝好給大多數人用。這是也“變態篇”系列文章的宗旨.
希望大家對 “委託擴充套件” 和 “遞推遞迴委託”提些看法,名字定義不太好,請指正!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-611753/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kotlin委託 & 擴充套件 & 高階函式Kotlin套件函式
- 部署傳遞擴充套件外掛套件
- C#自學(一)委託(delegate)、委託泛型、多播委託C#泛型
- 擴充套件篇套件
- 委託、事件--委託例項篇事件
- C# 擴充套件方法 借籤於 Objective-C 擴充套件類.C#套件Object
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 用 Lambda表示式傳遞委託
- c# ExpandoObject動態擴充套件物件C#Object套件物件
- C#委託C#
- 委託與事件-委託詳解(一)事件
- WCF擴充套件:行為擴充套件Behavior Extension套件
- es6 陣列擴充套件方法陣列套件
- Json擴充套件方法JSON套件
- LINQ擴充套件方法套件
- C#學習筆記-方法引數、擴充套件方法C#筆記套件
- 由事務擴充套件開談一談套件
- C# 事件委託C#事件
- C#委託(delegate)C#
- C# 委託事件C#事件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- [擴充套件推薦]Aliyun-oss-laravel —— Laravel最好的OSS Storage擴充套件套件Laravel
- C# 委託(delegate)、泛型委託和Lambda表示式C#泛型
- Sanic 擴充套件套件
- ORACLE 擴充套件Oracle套件
- 擴充套件工具套件
- 擴充套件歐幾里得套件
- DOM擴充套件套件
- 擴充套件ACL套件
- Lua擴充套件套件
- 照片擴充套件套件
- disable or 擴充套件套件
- 擴充套件表套件
- Mybatis擴充套件MyBatis套件
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 委託、Lambda表示式、事件系列04,委託鏈是怎樣形成的, 多播委託, 呼叫委託鏈方法,委託鏈異常處理事件
- INFORMIX表的預設初始擴充套件、下一個擴充套件資料塊以及一個表允許的最大擴充套件數。ORM套件