// 用n的階乘來演示 保存上一步計算的數據,進行下一次計算時候先判斷是否有上次執行過的,如果有直接獲取保存的值然後再進行下一步計算 // n! n*(n-1)*....*2*1 // 0! = 1 // n! = n*(n-1)! // 實現記憶前 var count = 0 // 執行的次數 f ...
// 用n的階乘來演示 保存上一步計算的數據,進行下一次計算時候先判斷是否有上次執行過的,如果有直接獲取保存的值然後再進行下一步計算 // n! n*(n-1)*....*2*1 // 0! = 1 // n! = n*(n-1)!
// 實現記憶前 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)