浅谈自记忆函数
淺談自記憶函數(shù)
最近閱讀《JavaScript忍者秘籍》看到了一種有趣的函數(shù):自記憶函數(shù)。
簡介
何為自記憶函數(shù)?書中提到:
記憶化(memoization)是一種構(gòu)建函數(shù)的處理過程,能夠記住上次計算結(jié)果
通過這句話可以得出,自記憶函數(shù)其實就是能夠記住上次計算結(jié)果的函數(shù)。在實現(xiàn)中,我們可以這樣進行處理:當(dāng)函數(shù)計算得到結(jié)果時,就將該結(jié)果按照參數(shù)存儲起來。采取這種方式時,如果另外一個調(diào)用也使用相同的參數(shù),我們則可以直接返回上次存儲的結(jié)果而不是再計算一遍。
顯而易見,像這樣避免既重復(fù)又復(fù)雜的計算可以顯著提高性能。對于動畫中的計算、搜索不經(jīng)常變化的數(shù)據(jù)或任何耗時的數(shù)學(xué)計算來說,記憶化這種方式是十分有用的。
一個自記憶函數(shù)的例子
下面這個例子展現(xiàn)自記憶函數(shù)的工作方式:
// 自記憶素數(shù)檢測函數(shù) function isPrime (value) {// 創(chuàng)建緩存if (!isPrime.answers) {isPrime.answers = {};}// 檢查緩存的值if (isPrime.answers[value] !== undefined) {return isPrime.answers[value];}// 0和1不是素數(shù)var prime = value !== 0 && value !== 1;// 檢查是否為素數(shù)for (var i = 2; i < value; i ) {if (value % i === 0) {prime = false;break;}}// 存儲計算值return isPrime.answers[value] = prime } isPrime函數(shù)是一個自記憶素數(shù)檢測函數(shù),每當(dāng)它被調(diào)用時:首先,檢查它的
answers屬性來確認(rèn)是否已經(jīng)有自記憶的緩存,如果沒有,創(chuàng)建一個。接下來,檢查參數(shù)之前是否已經(jīng)被緩存過,如果在緩存中找到該值,直接返回緩存的結(jié)果。
如果參數(shù)是一個全新的值,進行正常的素數(shù)檢測。
最后,存儲并返回計算值。
總結(jié)
自記憶函數(shù)有兩個優(yōu)點:
- 由于函數(shù)調(diào)用時會尋找之前調(diào)用所得到的值,所以用戶最終會樂于看到所獲得的性能收益。
- 它不需要執(zhí)行任何特殊請求,也不需要做任何額外初始化,就能順利進行工作。
但是,自記憶函數(shù)并不是完美的,它一樣有著缺陷:
- 任何類型的緩存都必然會為性能犧牲內(nèi)存。
- 很多人認(rèn)為緩存邏輯不應(yīng)該和業(yè)務(wù)邏輯混合,函數(shù)或方法只需要把一件事情做好。
- 對自記憶函數(shù)很難做負載測試或估算算法復(fù)雜度,因為結(jié)果依賴于函數(shù)之前的輸入。
更多專業(yè)前端知識,請上 【猿2048】www.mk2048.com 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
- 上一篇: 【工具相关】web-HTML/CSS/J
- 下一篇: 网页中二维码识别规则