自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用Lambda表達(dá)式編寫遞歸二

開發(fā) 后端
對于常見的遞歸函數(shù),如:階乘、斐波那契數(shù)列求值,我們先作如下假定:參數(shù)為 int 類型(Int32);返回值為 long 類型(Int64)。

上一篇文章介紹的 λ 演算是無類型的,對于 FIX、g 我們只知道:它們都是有獨(dú)個(gè)參數(shù)的函數(shù),它們的參數(shù)本身也是一個(gè)只有單一參數(shù)的函數(shù);同時(shí),它們值是又一個(gè)只有單一參數(shù)的函數(shù)。

基于這種描述,是無法將 FIX、g 轉(zhuǎn)化為 c# 代碼的,我們需要推斷出 FIX、g 類型。

我們先做一些假定,基于假定進(jìn)行推導(dǎo),得出結(jié)論再抽象為通用類型。

遞歸參數(shù)及返回值類型假定

對于常見的遞歸函數(shù),如:階乘、斐波那契數(shù)列求值,我們先作如下假定:

1.參數(shù)為 int 類型(Int32);

2.返回值為 long 類型(Int64)。

基于假推斷各類型

FIX g 類型

根據(jù)上篇文章中的描述:

  1. FIX g = λn. (ISZERO n) 1 (MULT n ((FIX g) (PRED n)))
  2. FIX g 55 = 5 * (4 * (3 * (2 * (1 * 1))) = 120 

FIX g 返回的是我們需要的遞歸函數(shù),這個(gè)遞歸函數(shù)

·接收一個(gè) int 參數(shù)(上面假定第 1 條)值為 5

·返回一個(gè) long 型數(shù)值(上面假定第 2 條)120。

因此,確定出 FIX g 的類型可表示為 Func<int, long>。

同時(shí)也能看出 n 是遞歸函數(shù)的參數(shù),n 類型為 int。

g 類型

階乘單步函數(shù)如下:

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

c# 中可表達(dá)為:g => f => n => n == 0 ? 1 : n * f(n – 1)

先來推斷 f 的類型:

·f 的參數(shù):f 接收 n – 1 作為參數(shù),因此,f 參數(shù)的類型和 n – 1 類型相同,即 n 的類型:int;

·f 的返回值:為 0 時(shí)返回 1,否則返回 n * f(n-1),f 的返回值類型也就是整個(gè)遞歸函數(shù)的返回值類型,即 long。

可確定 f 類型為 Func<int, long>。

n => n == 0 ? 1 : n * f(n – 1) 是傳入一個(gè) int 返回一個(gè) long,其類型 Func<int, long>。

先來變換下 g 的表示形式:

  1. var g = (Func<int, long> f) => {  
  2.     Func<int, long> t =   
  3.         n => n == 0 ? 1 : n * f(n - 1);  
  4.     return t;  
  5. };  // 示意代碼 

從上面這段代碼可以清楚到看出 g 接收一個(gè) Func<int, long> 類型的參數(shù) f,返回一個(gè)類型為 Func<int, long> 的委托,可得出:

g 的類型為 Func<Func<int, long>, Func<int, long>>

FIX 類型

FIX g 可寫作 FIX(g),可以看出: FIX g 的類型 == FIX(g) 的類型 == FIX 返回值的類型。前面得知 FIX g 類型為 Func<int, long>,也就可推出 FIX 返回值類型為 Func<int, long>。

FIX 接受 g 作為參數(shù),F(xiàn)IX 的參數(shù)類型也就是 g 的類型,可知 FIX 參數(shù)類型為 Func<Func<int, long>, Func<int, long>>。

由此得出 FIX 的類型為:Func<Func<Func<int, long>, Func<int, long>>, Func<int, long>>。

(估計(jì)這是多數(shù)開發(fā)人員見過的最復(fù)雜的泛型了。后面還在更復(fù)雜的吆?。?/p>

小結(jié)

名稱 λ 演算表達(dá)式 數(shù)據(jù)類型
輸入?yún)?shù) n int
迭歸返回值 FIX g n long
迭歸函數(shù) FIX g Func<int, long>
單步函數(shù) g Func<Func<int, long>, Func<int, long>>
不動點(diǎn)組合子 FIX Func<Func<Func<int, long>, Func<int, long>>, Func<int, long>>

通用類型

基于以上部分的推演和小結(jié),我們可以歸納出通用類型:

名稱 λ 演算表達(dá)式 數(shù)據(jù)類型
輸入?yún)?shù) n TInput
迭歸返回值 FIX g n TResult
迭歸函數(shù) FIX g Func<TInput, TResult>
單步函數(shù) g Func<Func<TInput, TResult>, Func<TInput, TResult>>
不動點(diǎn)組合子 FIX Func<Func<Func<TInput, TResult>, Func<TInput, TResult>>, Func<TInput, TResult>>

基于本文推斷出的類型,不動點(diǎn)組合子轉(zhuǎn)換為 c# 代碼了不容易多了。下一篇文章將以 Y 組合子為例進(jìn)行說明。

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

責(zé)任編輯:張偉 來源: 博客園
相關(guān)推薦

2009-08-31 17:11:37

Lambda表達(dá)式

2013-04-10 10:46:06

LambdaC#

2009-10-12 10:11:08

Lambda表達(dá)式編寫

2009-08-10 09:41:07

.NET Lambda

2009-09-11 09:48:27

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-15 15:18:00

Linq Lambda

2022-12-05 09:31:51

接口lambda表達(dá)式

2023-11-02 08:25:58

C++Lambda

2012-06-26 10:03:58

JavaJava 8lambda

2009-08-27 09:44:59

C# Lambda表達(dá)

2009-09-17 10:40:22

Linq Lambda

2009-09-15 17:30:00

Linq Lambda

2009-09-17 09:44:54

Linq Lambda

2024-03-25 13:46:12

C#Lambda編程

2023-09-25 13:28:14

C++Lambda

2009-04-29 09:05:59

Lambda抽象代表.NET

2009-08-26 16:17:23

C# Lambda表達(dá)

2009-08-27 09:57:50

C# Lambda表達(dá)

2009-09-17 09:09:50

Lambda表達(dá)式Linq查詢
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號