日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈自记忆函数

發布時間:2023/12/2 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈自记忆函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

淺談自記憶函數

最近閱讀《JavaScript忍者秘籍》看到了一種有趣的函數:自記憶函數。

簡介

何為自記憶函數?書中提到:

記憶化(memoization)是一種構建函數的處理過程,能夠記住上次計算結果

通過這句話可以得出,自記憶函數其實就是能夠記住上次計算結果的函數。在實現中,我們可以這樣進行處理:當函數計算得到結果時,就將該結果按照參數存儲起來。采取這種方式時,如果另外一個調用也使用相同的參數,我們則可以直接返回上次存儲的結果而不是再計算一遍。

顯而易見,像這樣避免既重復又復雜的計算可以顯著提高性能。對于動畫中的計算、搜索不經常變化的數據或任何耗時的數學計算來說,記憶化這種方式是十分有用的。

一個自記憶函數的例子

下面這個例子展現自記憶函數的工作方式:

// 自記憶素數檢測函數 function isPrime (value) {// 創建緩存if (!isPrime.answers) {isPrime.answers = {};}// 檢查緩存的值if (isPrime.answers[value] !== undefined) {return isPrime.answers[value];}// 0和1不是素數var prime = value !== 0 && value !== 1;// 檢查是否為素數for (var i = 2; i < value; i ) {if (value % i === 0) {prime = false;break;}}// 存儲計算值return isPrime.answers[value] = prime }

isPrime函數是一個自記憶素數檢測函數,每當它被調用時:

首先,檢查它的

answers屬性來確認是否已經有自記憶的緩存,如果沒有,創建一個。

接下來,檢查參數之前是否已經被緩存過,如果在緩存中找到該值,直接返回緩存的結果。

如果參數是一個全新的值,進行正常的素數檢測。

最后,存儲并返回計算值。

總結

自記憶函數有兩個優點:

  • 由于函數調用時會尋找之前調用所得到的值,所以用戶最終會樂于看到所獲得的性能收益。
  • 它不需要執行任何特殊請求,也不需要做任何額外初始化,就能順利進行工作。

但是,自記憶函數并不是完美的,它一樣有著缺陷:

  • 任何類型的緩存都必然會為性能犧牲內存。
  • 很多人認為緩存邏輯不應該和業務邏輯混合,函數或方法只需要把一件事情做好。
  • 對自記憶函數很難做負載測試或估算算法復雜度,因為結果依賴于函數之前的輸入。

更多專業前端知識,請上 【猿2048】www.mk2048.com 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的浅谈自记忆函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。