// 用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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/164476.html
標籤:JavaScript
上一篇:JavaScript2 基礎
下一篇:vue實體化程序
