精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Lambda表達式編寫遞歸一:前言及基礎

開發 后端
最近比較輕閑,靜下心來學習了下相關的的一些理論,并深入思考,略有所悟,在此和大家分享下。本文及后續章節會用到相當復雜的泛型及 lambda 表達式,請做好相關技術和心理準備。

前言

這是一個比較古老的話題,三年半之前,老趙就此寫過一篇很文章《使用Lambda表達式編寫遞歸函數》。其中提出了偽遞歸的概念,提出了自己的解決方式,也引出了裝配腦袋 使用不動點組合子 的解決辦法。此后好長一段時間,偽遞歸和不動點組合子成了兩個園子里的兩大熱門話題。

當年我也寫了篇文章《反駁 老趙 之 “偽”遞歸》參與了爭論,不過對老趙提出的解決方式及裝配腦袋的不動點組合子思路,一直沒弄清楚。中間一段時間,工作忙,忘卻了。

最近比較輕閑,靜下心來學習了下相關的的一些理論,并深入思考,略有所悟,在此和大家分享下。

本文及后續章節會用到相當復雜的泛型及 lambda 表達式,請做好相關技術和心理準備。

使用 Lambda 表達式構建遞歸函數

很多朋友認為這很容易,隨手便可用 lambda 表達式寫出一個階乘遞歸:

  1. Func<intint> fact = x => x <= 1 ? 1 : x * fact(x - 1); 

不過,很抱歉,這行代碼是無法通過編譯的,VS 提示:使用了未賦值的變量 fact。

有種簡單的解決辦法,把上面這行代碼拆成兩行:

  1. Func<intint> fact = null;  
  2. fact = x => x <= 1 ? 1 : x * fact(x - 1); 

不過這種寫法也有問題,老趙說得比較清楚,我就不在贅述了,請查看《使用Lambda表達式編寫遞歸函數》一文中偽遞歸部分。

那么如何解決 lambda 表達式構建遞歸函數的問題呢?根據函數式編程理論,我們可以使用不定點組合子。

在學習不定點組合子之前,需要先了解更基礎 λ 演算。

λ 演算

λ 演算的基礎請大家參考維基百科:

http://zh.wikipedia.org/wiki/Lambda_演算

http://en.wikipedia.org/wiki/Lambda_calculus

非形式化的描述

請確保你已經理解了文中幾個表達式的等價關系:

  1. (λf. f 3)(λx. x + 2) == (λx. x + 2) 3 == 3 + 2   
  2. (λx. λy. x - y) 7 2 == (λy.7 - y) 2 == 7 - 2 

還清楚知道函數應用(application)的概念及其左結合性:

  1. f x y == (f x) y 

還有它的各種等價變換

  1. f x y == (f x) y = (f(x))y = (f(x))(y) = f(x)(y) 

歸約

并會運用三個常用的規約(Reduction

1.α-變換α-conversion

2.β-歸約β-reduction

3.η-變換η-conversion

不動點組合子

請參考:

http://zh.wikipedia.org/wiki/不動點組合子

http://en.wikipedia.org/wiki/Fixed-point_combinator

定義

不動點組合子(Fixed-point combinator,或不動點算子,使用 FIX 表示)是計算其他函數的一個不動點的高階函數。

不動點算子具有以下特性,對于任何函數 f 都有:

  1. FIX ff = f (FIX f) 

定義匿名的遞歸函數

不動點組合子允許定義匿名的遞歸函數,具體來說是將一個非遞歸的單步函數(只執行遞歸中的一步,a single step of this recursion,使用 g 表示)轉換為遞歸函數。

如下是階乘的單步函數定義:

  1. g = λf. λn. (ISZERO n) 1 (MULT n (f (PRED n))) 

FIX g 可獲取到匿名的遞歸函數:

  1. FIX g = λn. (ISZERO n) 1 (MULT n ((FIX g) (PRED n))) 

向 FIX g 的參數 n 傳入值 5,可最終得出:

  1. FIX g 55 = 5 * (4 * (3 * (2 * (1 * 1)))) = 120 

常用的不定點組合子

不動點組合子中最有名的(也可能是最簡單的)是 Y 組合子:

  1. Y = λf. (λx. f (x x)) (λx. f (x x)) 

另一個常見不動點組合子是圖靈不動點組合子(阿蘭·圖靈發現的):

  1. Θ = (λx. λy. (y (x x y))) (λx.λy.(y (x x y))) 

傳值調用(call-by-value)

在 λ 演算中,每個表達式(lambda term)都代表一個只有單獨參數的函數,這個函數的參數本身也是一個只有單一參數的函數,同時,函數的值是又一個只有單一參數的函數。

根據此描述,可知 λ 演算中函數只有一個參數,這個參數是一個函數,而不是一個值。而對于我們常見的遞歸(階乘、斐波那契數列求值),參數都是值(自然數)。兩者是不匹配的。

為了適當傳值調用,需要將不動點組合子 η-展開:

簡單而言 η-變換 是說 λx. f x 和 f 可以互相轉換。從 f 這種簡單形式 η-變換 為 λx. f x 復雜形式,稱為 η-展開

對于 Y 組合子,通常是將其中的 (x x) η-展開為  λy. x x y,由此得出傳值調用版本的 Y組合子(也稱為 Z 組合子):

  1. Y = λf. (λx. f (λy. x x y)) (λx. f (λy. x x y)) 

如果不展開呢?會怎樣?

如果使用不展開的不動點算子,也能寫出可編譯通過的代碼,但最終執行會陷入死循環,直至堆棧溢出。

小結

后續章節將使用以下符號和名稱,不再另行說明:

1.FIX:不動點組合子

2.g:單步函數

3.n:表示遞歸函數的參數(在階乘、斐波那契數列求值中是一個自然數)

對于 FIX、g、n:

1.FIX g: 將會生成對應的遞歸函數

2.FIX g n: 將進行遞歸運算

λ 演算表達式與 c# lambda 表達式的對應關系

λx. x + 2

λx. x + 2 在 c#中的 lambda 表達式可表式為:x => x+ 2;

假定 x 的 int 類型,可寫作:

  1. Func<int, int> f = x => x + 2; 

相應 (λx. x + 2) 1 可寫為:

  1. var result = f(1);    // 結果為 3 

λx. λy. x + y

復雜點,λx. λy. x + y 用 c# 的 lambda 表達式表示為:x => y => x + y;

x, y 類型為均整數時,可寫作:

  1. Func<int, Func<int, int>> f = x => y => x + y; 

相應 (λx. λy. x + y) 1 2 便是:

  1. var result = f(1)(2);     // 結果為 3 

λx. λy. λz. x + y + z

再復雜些,λx. λy. λz. x + y + z 表示為:x => y=> z => x + y + z,三個參數都為 int 時 c# 代碼:

  1. Func<int, Func<int, Func<int, int>>> f = x => y => z => x + y + z; 

可如下調用:

  1. // (λx. λy. λz. x + y + z) 1 2 3  
  2. var result1 = f(1)(2)(3);    //結果為 6  
  3.  
  4. // (λx. λy. λz. x + y + z) 1  →  λy. λz. 1 + y + z   
  5. Func<int, Func<int, int>> g = f(1);   
  6. // (λy. λz. 1 + y + z) 2  →  λz. 1 + 2 + z  →  λz. 3 + z  
  7. Func<int, int> h = g(2);  
  8. // (λz. 3 + z) 3  →  3 + 3  →  6  
  9. var result2 = h(3);        // 結果為 6 

每 5 行,向 f 傳入一個常量 1,返回一個新的方法 g;再經過第 7 行,向 g 傳入常量 2,再次返回一個新方法 h。

方法 h 只能接受一個參數,***得出 h(3) = 6。

為什么不是  (x, y, z) => x + y + z?

也許你會有疑問,不就是 x、y、z 三個整數加起來嘛,為什么搞這么復雜,像下面這樣不是更簡單嗎?

  1. Func<int, int, int, int> f = (x, y, z) => x + y + z;  
  2. var result = f(1, 2, 3); 

確實簡單,不過:

在 λ 演算中,每個表達式(lambda term)都代表一個只有單獨參數的函數,這個函數的參數本身也是一個只有單一參數的函數,同時,函數的值是又一個只有單一參數的函數。

注意都是只有一個參數,對應到 c# 的 lambda 表達式,也應是一個參數,所以是:x => y=> z => x + y + z。

總結

λ 演算表達式 c# lambda 表達式
λx. x + 2 x => x+ 2
λx. λy. x + y x => y => x + y
λx. λy. λz. x + y + z x => y=> z => x + y + z

好像有些規律:對于一個 Lambda terms,去掉“λ”并把“.”替換為”=>”便可變成對應 lambda 表達式。(注意,這個規律不嚴謹!)

練習一下,看看下面這個如何轉為 lambda 表達式:

  1. λx. λn. (g (x x) n) 

先對它進行一步演算得出:

  1. λx. λn. (g (x(x)) (n))  

運用上的的規律,可以寫出 lambda 表達式:x => n => g((x(x))(n)

對于復雜點的如:λx. f ( λv. (x x) v),這條規律就不適用了。文后續部分會通過演算繞開這種復雜的轉換,不對此進行討論。

理解本文中的泛型和 lambda 表達式

對于上一部分使用的泛型和 lambda 表達式,尤其是下面這行代碼,你需要花點時間去理理思路(因為后續章節中泛型要遠比此復雜):

  1. Func<int, Func<int, Func<int, int>>> f = x => y => z => x + y + z; 

如果對你對泛型和 lambda 認識不是非常深刻的話,難度有點大,不妨先從下面這個簡單點的開始:

  1. Func<int, Func<int, int>> f = x => y => x + y; 

換種寫法,或許有助于理解:

  1. Func<int, Func<int, int>>  f = x => {                
  2.     Func<int, int> g =  y => { return x + y ;};  
  3.     return g;  
  4. }; 

本文簡單闡述了 lambda 構建遞歸函數的問題,粗略提及 λ 演算及不動點組合子的知識,并總結了下 λ 演算表達式與 c# lambda 表達式的對應關系。

原文鏈接:http://www.cnblogs.com/ldp615/archive/2013/04/09/recursive-lambda-expressions-1.html

責任編輯:張偉 來源: 博客園
相關推薦

2009-08-31 17:11:37

Lambda表達式

2013-04-10 10:58:19

LambdaC#

2009-10-12 10:11:08

Lambda表達式編寫

2009-09-15 17:30:00

Linq Lambda

2009-08-10 09:41:07

.NET Lambda

2009-09-11 09:48:27

Linq Lambda

2022-12-05 09:31:51

接口lambda表達式

2009-09-15 15:18:00

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2023-11-02 08:25:58

C++Lambda

2012-06-26 10:03:58

JavaJava 8lambda

2009-09-17 09:44:54

Linq Lambda

2009-09-17 10:40:22

Linq Lambda

2009-08-27 09:44:59

C# Lambda表達

2023-09-25 13:28:14

C++Lambda

2009-04-29 09:05:59

Lambda抽象代表.NET

2024-03-25 13:46:12

C#Lambda編程

2009-09-17 09:09:50

Lambda表達式Linq查詢

2009-08-27 09:57:50

C# Lambda表達

2009-08-26 16:17:23

C# Lambda表達
點贊
收藏

51CTO技術棧公眾號

日韩av在线天堂网| 亚洲午夜一二三区视频| 国产日韩亚洲欧美| 中文字幕手机在线观看| 久久激情av| 色琪琪一区二区三区亚洲区| 中文字幕日韩一区二区三区| 亚洲精品久久久久久久久久久久久久| 亚洲美女黄色| 中文字幕av一区中文字幕天堂 | 欧美日韩国产精选| 男人c女人视频| 韩国福利在线| 国产乱人伦偷精品视频免下载| 91精品国产91久久久久久| 长河落日免费高清观看| 高清精品视频| 8x8x8国产精品| 人妻内射一区二区在线视频| 午夜成年人在线免费视频| 欧美日韩一区二区三区不卡视频| 日韩欧美a级成人黄色| 国产精品99久久久久久大便| 五月婷婷激情在线| 国产中文一区二区三区| 日韩免费观看高清| 久久香蕉精品视频| 色婷婷亚洲mv天堂mv在影片| 日韩激情av在线免费观看| 青娱乐精品在线| 亚洲精品555| 欧美日韩午夜激情| 欧美中文字幕在线观看视频| 日韩成人影视| 国产欧美精品一区二区色综合朱莉| 国内视频一区二区| а√天堂资源在线| 精品一区二区三区不卡| 国产精品国产三级国产aⅴ9色| 精品成人久久久| 国一区二区在线观看| 精品国产一区二区三区四区在线观看| av网站免费在线看| 日本午夜精品| 亚洲国产精品中文| 韩国三级视频在线观看| 日韩一区二区三区色| 在线电影欧美成精品| 一区二区成人网| 亚洲欧美在线成人| 欧美性受xxxx黑人xyx| 色婷婷综合久久久久中文字幕| 忘忧草在线日韩www影院| 午夜天堂影视香蕉久久| www.av毛片| av在线视屏| 黄色一区二区三区| 欧美v在线观看| 中文字幕在线看片| 色综合天天综合网天天看片| 成人三级视频在线播放| 欧美一区久久久| 欧美性猛交一区二区三区精品| 男人舔女人下面高潮视频| 视频在线日韩| 欧美人与z0zoxxxx视频| www.桃色.com| 亚洲免费一区三区| 亚洲娇小xxxx欧美娇小| 亚洲欧美视频在线播放| 综合亚洲色图| 在线观看欧美www| 久久福利免费视频| 黄色欧美日韩| 日本午夜精品理论片a级appf发布| 亚洲中文一区二区| 激情欧美一区二区三区在线观看| 亚洲在线免费看| 成人毛片在线精品国产| 91蜜桃视频在线| 日本在线成人一区二区| 黄色小网站在线观看| 亚洲综合色自拍一区| 99爱视频在线| 四虎地址8848精品| 亚洲国产另类久久精品| 我想看黄色大片| 亚洲色图二区| 97不卡在线视频| 日韩中文字幕高清| 国产剧情在线观看一区二区| 精品国产免费人成电影在线观...| 九色视频成人自拍| 亚洲免费在线观看| 久久久久久久久久久久久国产精品| 国产成人精品一区二区三区视频| 精品美女一区二区| 国产高清一区二区三区四区| 一二三区不卡| 欧美一区二区.| av老司机久久| 久久久国产精品麻豆| 强开小嫩苞一区二区三区网站| 福利在线免费视频| 91麻豆精品国产综合久久久久久| av在线播放网址| 99久久久久国产精品| 97视频在线观看亚洲| 国产精品久久久久久久免费| 久久综合国产精品| 97超碰国产精品| a屁视频一区二区三区四区| 欧美α欧美αv大片| 亚洲a∨无码无在线观看| 99精品国产福利在线观看免费| 91久久精品国产91久久| 国产在线视频福利| 亚洲成人免费影院| 在线a免费观看| 欧美精品一区二区三区中文字幕 | 欧美在线日韩精品| 黄色羞羞视频在线观看| 欧美人与禽zozo性伦| 欧美黄色一级生活片| 国产精品视频久久一区| 99在线看视频| 欧美jizz18性欧美| 欧美影院一区二区| 中文字幕在线观看的网站| 亚洲成人资源| 91手机在线观看| 久久五月精品| 777奇米成人网| av片在线免费看| 日本不卡一区二区| 欧美亚洲免费高清在线观看| 天堂8中文在线最新版在线| 亚洲爱爱爱爱爱| 欧美成人精品激情在线视频| 国产在线国偷精品产拍免费yy | 永久免费av在线| 日韩欧美999| 欧美bbbbb性bbbbb视频| 国产乱码精品| 久久综合九色综合久99| 交100部在线观看| 亚洲高清久久网| 日韩精品――中文字幕| 成人av电影免费在线播放| 日韩精品综合在线| 国产亚洲成av人片在线观黄桃| 欧美劲爆第一页| 黄色aaa毛片| 午夜久久久久久久久| 中文字幕在线播放视频| 亚洲一区二区成人| 欧美日韩在线观看一区| 日韩高清不卡| www.亚洲一区| 99国产在线播放| 亚洲综合色噜噜狠狠| 水蜜桃av无码| 久久久久国产精品午夜一区| 日韩视频精品| 九九热这里有精品| 久久综合国产精品台湾中文娱乐网| 99国产精品99| 红桃av永久久久| 99精品全国免费观看| 久久er99精品| 欧美一区二区视频在线播放| 蜜臀av一区| 国产成人高清激情视频在线观看 | 好吊妞国产欧美日韩免费观看网站| 久久久久久欧美| 日本在线视频1区| 欧美三级在线播放| 激情小说中文字幕| 91免费在线播放| 手机av在线免费| 国产中文一区| 日本免费高清一区二区| 国产一区二区av在线| 午夜精品久久久久久久男人的天堂 | 亚洲а∨天堂久久精品喷水 | 男女精品网站| 中文字幕欧美日韩一区二区三区| 亚洲综合网狠久久| 国产99视频精品免视看7| 国产调教视频在线观看| 日韩av中文字幕在线播放| 天天爱天天做天天爽| 亚洲美女屁股眼交3| 欧美 日本 国产| 激情都市一区二区| 国产在线观看福利| 亚洲电影在线一区二区三区| 久久国产精品一区二区三区四区 | 欧美一区二区高清| 69国产精品视频免费观看| 成人欧美一区二区三区白人| 99久久人妻精品免费二区| 久久国产精品区| 欧美成人一区二区在线观看| 天天射成人网| 欧美日韩国产一二| 这里视频有精品| 国产精品丝袜久久久久久不卡| 久久五月精品中文字幕| 综合久久五月天| 无码国产精品一区二区色情男同| 在线成人午夜影院| 精品免费囯产一区二区三区 | 成人免费观看cn| 亚洲一区二区三区| 日本一区二区三区www| 99久久婷婷国产综合精品青牛牛| 国产精品视频网站| 捆绑调教日本一区二区三区| 欧美老少做受xxxx高潮| 在线免费观看的av网站| 亚洲男人av在线| 四虎在线视频免费观看| 欧美一级精品大片| 在线观看中文字幕av| 欧美午夜视频一区二区| 黄色小视频在线免费看| 亚洲精品免费在线| 美女视频久久久| 国产精品人成在线观看免费| 91在线无精精品白丝| 92国产精品观看| 人妻体内射精一区二区三区| 国产成人aaaa| 国内自拍偷拍视频| 国产精品99久久久久久久vr | 妞干网视频在线观看| 久久久久av| 法国空姐在线观看免费| 偷拍欧美精品| 亚洲AV无码成人精品一区| 色喇叭免费久久综合| 日本不卡在线播放| 欧美日韩在线网站| 日韩精品一区二区三区丰满| 亚洲精品动态| 欧美日韩中文国产一区发布| 久久99国内| 深夜福利成人| 久久社区一区| 亚洲欧美日韩不卡| 综合久久十次| 国产av熟女一区二区三区 | 国产精品不卡一区| 一本色道久久88| 综合中文字幕亚洲| 国产va在线播放| 亚洲综合偷拍欧美一区色| 国产在线一区视频| 精品久久久久久久久久| 天干夜夜爽爽日日日日| 欧美一a一片一级一片| 亚洲天堂网视频| 日韩小视频在线观看专区| 亚洲精品免费在线观看视频| 亚洲精品美女久久久久| 成人高清网站| 久久精品国产亚洲精品2020| 日韩伦理av| 538国产精品视频一区二区| 日韩电影免费观| 91色在线视频| 国产精品15p| 欧美日韩精品免费在线观看视频| 国产剧情在线观看一区| 国产大尺度在线观看| 亚洲视频久久| 一本久道中文无码字幕av| 精品一区二区在线播放| 成年人看片网站| wwww国产精品欧美| 欧美另类videoxo高潮| 亚洲成a人片在线不卡一二三区| 亚洲色成人www永久网站| 日韩一区二区免费高清| 日韩国产福利| 久久久av网站| 97se综合| 97碰碰视频| 欧美精品一区二区三区中文字幕| 国产在线无码精品| 丝袜美腿亚洲一区| 欧美高清精品一区二区| 99精品视频在线免费观看| 日本免费网站视频| 欧美日韩国产黄| 国产熟女一区二区三区四区| 国产丝袜一区二区三区免费视频| 黄色片免费在线观看| 欧美在线一区二区视频| 日韩成人在线观看视频| 色噜噜一区二区| 亚洲久久视频| xxx中文字幕| 国产精品区一区二区三| 永久免费看片在线播放| 欧美猛男超大videosgay| 青青草手机在线| 欧美精品xxx| 国产精品一区二区美女视频免费看| 欧美一区二区三区四区在线观看地址| 中文字幕亚洲精品乱码| 无限资源日本好片| 26uuu欧美| 国产一级在线观看视频| 欧美精品三级日韩久久| 国产视频精选在线| 国内精品一区二区三区| 精品午夜av| 中文字幕欧美日韩一区二区| 日本网站在线观看一区二区三区| 国产亚洲色婷婷久久99精品91| 亚洲欧美另类综合偷拍| 在线观看毛片av| 亚洲一品av免费观看| 在线最新版中文在线| 国产 高清 精品 在线 a| 91精品久久久久久久蜜月| 九色porny自拍| 国产欧美日韩中文久久| 岛国av中文字幕| 日韩极品精品视频免费观看| sm在线观看| 国产亚洲一区在线播放| 亚洲网站视频| 国产精品嫩草69影院| 一区二区三区不卡视频| 国产99对白在线播放| 不卡av日日日| 日韩精品亚洲专区在线观看| 免费看污污视频| 国产精品一级黄| 91插插插插插插| 欧美一二三区在线| 亚洲wwwww| 成人国产一区二区| 亚洲天堂男人| 中国免费黄色片| 欧美日韩精品在线观看| 香蕉久久一区二区三区| 91国产在线精品| 亚洲免费福利一区| 熟女人妇 成熟妇女系列视频| 久久久亚洲精品一区二区三区| 麻豆成人免费视频| 中文字幕成人在线| 亚洲伦理一区二区| 女女百合国产免费网站| 国产成人av影院| 欧美日韩综合在线观看| 精品亚洲精品福利线在观看| 婷婷六月国产精品久久不卡| 视频在线99re| 国产在线乱码一区二区三区| www.99re7.com| 亚洲欧美中文日韩在线v日本| 日韩av电影资源网| 老司机午夜网站| 99riav一区二区三区| 无码免费一区二区三区| 久久国内精品一国内精品| 永久免费精品视频| 人妻少妇被粗大爽9797pw| 中文字幕不卡在线播放| 国产wwwxxx| 欧美影院在线播放| 欧美成人自拍| 欧美69精品久久久久久不卡| 粉嫩av一区二区三区免费野| 99re热久久这里只有精品34| 99re在线| 日韩电影在线观看电影| 国产女人被狂躁到高潮小说| 亚洲精品中文字幕女同| 婷婷精品久久久久久久久久不卡| 一本大道东京热无码aⅴ| 久久一二三国产| 国产精品视频一区二区三区,| 高清欧美性猛交xxxx黑人猛交| 教室别恋欧美无删减版| 久久久久久国产精品日本| 色综合久久综合网欧美综合网| 国产日产一区二区| 久久久久无码国产精品一区| 久久99久久99精品免视看婷婷 | 日韩欧美一级二级三级久久久| 极品在线视频| 4444在线观看| 国产亲近乱来精品视频| 天堂网av2014|