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')
下面就是結果了~~
平常項目中能用到的話,也能夠提高些性能吧~~~^_^