如何理解高階函數

昨天開始讀 SICP,這本書作為 MIT 所有理工科類學生的公共必修課(類似于咱們的高數),還是挺有價值的,很清楚的解釋了一些基本概念,這里先總結一下高階函數吧。

高階函數的定義是接受一個函數作為參數,或者返回一個函數的函數。不過這樣的解釋作為總結也就罷了, 如果用來學習、理解的話。。。。。?;故強淳嚀謇影?。

函數

码报开奖结果本期 www.iwqgw.icu 我們知道函數是對過程的抽象,或者說是對某種過程的通用描述,比如說下面這個求絕對值的過程:

  • 5 -> |5| = 5

  • -1 -> |-1| = 1

  • 0 -> |0| = 0

求絕對值的過程是判斷一個數是否大于等于 0,如果是的話,返回這個數,否則返回它的相反數。于是,為了對這個“復雜”過程進行抽象,我們可以定義一個函數 abs(x), 它專門用來計算一個數的絕對值。

可別小看這個貌似人人都會的簡單的過程,它實際上是一件值得總結的事情,abs(x) 的價值絕不在于它實現求絕對值的過程,而是告訴我們:

如果有一系列操作,僅僅是輸入的參數不同,但是對于參數的處理過程大致相同,我們就可以用函數來抽象這個操作。

求和

我們都熟練的掌握如何計算 1 到 n 中所有自然數的和,自然就可以定義一個函數 sum(a, b),表示從 a 到 b 中所有自然數的和,但如果被求和的不是自然數,而是某個表達式呢?

學過數學的人都知道,有一個符號叫求和符號,也即是這玩意:Σ,上述的 a 和 b 分別是它的上下標,后面還跟著一個函數 f(x)

Σf(x) = f(a) + f(a+1) + …… + f(b)

我們可以看到,Σ 也滿足之前對函數的定義,首先它表示了一些列操作,隨著輸入參數(這時候是一個函數)的不同,它代表了不同的操作。但不管怎樣,它對參數的處理方式總是類似的:依次把 a 到 b 中的每一個數代入到參數函數中,并且求和。

高階函數

很多現代編程語言都實現了數組的 map 方法,它本質上就是一個高階函數。為什么這么說,或者說為什么要在這里設計一個高階函數呢?我們可以看一下 map 方法的本質:

for item in array:
  item = handle(item)

你可以看到這個過程的變量其實是 handle 函數,也就是說 map 方法其實是對 “不同的 handle 函數的相似使用” 這一過程的抽象,因此它的參數必須是一個函數,這也就是為什么 map 是一個高階函數。

同理,reduce 等也是高階函數。

總結

高階函數就是玩函數的,它把函數當做變量來用,回顧一下函數的定義:

如果有一系列操作,僅僅是輸入的參數不同,但是對于參數的處理過程大致相同,我們就可以用函數來抽象這個操作。

這里并沒有規定參數是什么,如果是一個數字,那我們可以理解為這是個普通函數;如果變量自身就是一個函數,我們可以理解為這是一個高階函數。

不過我一直堅持的理念是,概念和名詞只是用來簡化、抽象某個具體的描述,它應該被用來方便人們進行交流而不是約束你的思維。所以高階函數就是函數,不用做刻意的區

來源:bestswifter-簡書

上一篇: 開發者Ryan Petrich發布3款插件的beta更新

下一篇: Swift 語言的設計錯誤

分享到: 更多
500彩票幸运快三计划软件下载 赢钱捕鱼 二八杠棋牌游戏中心 抢庄牌九平台官网 北京pk10定位胆技巧 pk10大小单双免费计划 pk10软件手机版 pk104码倍投方法 足球财富 速报比分直播 七星彩投号技巧 两面盘彩票平台 足球比分直播 新时时历史开奖 快三大小计划软件手机版 三肖选①肖