函數的記憶----函數性能優化

// 用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)
相關文章
相關標籤/搜索