1 記憶函式是什麼呢?
讓函式記住曾經計算過的引數對應的結果
2 那我們為什麼使用記憶函式呢?
答案是 避免重複計算
3 在工作中如何使用和實現函式記憶 ?
形成閉包,在閉包中維護一個雜湊陣列(其實就是物件),讓雜湊陣列幫你記住曾經你做過的計算
請看下面的例子:(計算質數)
先寫兩個函式
第一個數帶記憶功能的:
let isPrime = (function () {
let hash = {//雜湊中儲存類似這樣的結構
//8: false,
//7: true
}
let isPrime = (n)=> { // 返回內層函式
if (n <3) {
return true
} else if (hash[n] !==undefined) {
return hash[n]
} else {
for (leti = 2; i < Math.sqrt(n);i++) {
if (n%i ==0) {
return hash[n] =false;
}
}
return hash[n] =true
}
}
return isPrime
})() //這個函式使用閉包 和 一個物件(實現記憶)
第二個是個普通函式
let isPrime1 = (n)=> {
if (n <3) {
return true
} else {
for (leti = 2; i < Math.sqrt(n);i++) {
if (n%i ==0) {
return false;
}
}
return true
}
}
// 先宣告一個空陣列 我往裡push 1000000 個 1100 以內的 隨機數
let array = []
for (leti = 0; i < 1000000; i++) {
array.push(parseInt(Math.random() *1100 ))
}
進入測試階段 ~~~ (利用console.time 和 console.Endtime)看看執行時間.....
// 這個是沒有帶函式記憶的~~
console.time('isPrime1')
for (leti = 0; i < array.length;i++) {
isPrime1(array[i])
}
console.timeEnd('isPrime1')
// 這個是帶函式記憶的
console.time('isPrime')
for (leti = 0; i < array.length;i++) {
isPrime(array[i])
}
console.timeEnd('isPrime')
下面就是結果了~~
日常專案中能用到的話,也可以提升些效能吧~~~^_^