// 實現記憶前 var count = 0 // 執行的次數 function factorial(n) { count ++ if(n == 0 || n==1) { return 1 } return n * factorial(n-1) } for(var i=1; i<=5; i++) { console.log(factorial(i)) }
// 實現記憶後 var count = 0 // 執行的次數 var cache = [] //執行過的數據保存起來 ---好比從5開始計算,再計算6的階乘時候只執行6x5! 而5的階乘則直接從保存的數據中獲取 function factorial(n) { count++ if (cache[n]) { // 若是有緩存(cache的值)直接獲取緩存內的值 return cache[n] } else { //沒有則進行計算 if (n == 0 || n == 1) { cache[0] = 1 cache[1] = 1 return 1 } else { cache[n] = n * factorial(n - 1) return cache[n] } } } console.time('3') console.log(factorial(3)) console.timeEnd('3') console.log('=================') console.time('4') console.log(factorial(4)) console.timeEnd('4')
// 優化 function factorial(n) { if (n == 0 || n == 1) { return 1 } else { return n * factorial(n - 1) } } // 封裝函數 function memorize(fn) { var cache = {} // 用對象來存儲值 return function() { var key = arguments.length + Array.prototype.join.call(arguments) //實現key的惟一標識 if (cache[key]) { return cache[key] } else { // 利用argumens來獲取形參的類數組 cache[key] = fn.apply(this, arguments) return cache[key] } } } var newF = memorize(factorial)