面对编写JavaScript memoization函数的问题

时间:2018-04-14 02:52:32

标签: javascript memoization

我正在尝试编写memoization函数,但不断收到以下错误。

Error - "TypeError: getNthFibonacciNo is not a function
    at dabebimaya.js:28:38
    at https://static.jsbin.com/js/prod/runner-4.1.4.min.js:1:13924
    at https://static.jsbin.com/js/prod/runner-4.1.4.min.js:1:10866"

如何在我的代码中找到此错误?我试过谷歌搜索错误无济于事。如果可能的话,请指出任何其他错误。

function memoize(fn) {
  var cache = {};
  if (cache[arguments[0]]!==undefined) {
    return cache[arguments[0]];
  }  
  else {
    var value = fn.apply(this, arguments);
    cache[arguments[0]] = value;  
    return value;
  }
}

var getNthFibonacciNo = memoize(function(n){
    //1,1,2,3,5,8,13,21,34
    if(i<=2)
      return 1;

    var fib = [0,1,1];
    for(var i=3;i<=n;i++) {
      fib[i] = fib[i-2]+fib[i-1];
    }

    return fib[n];
});

console.log(getNthFibonacciNo(7));

2 个答案:

答案 0 :(得分:2)

您的memoize函数未返回函数。

function memoize(fn) {
  var cache = {};
  return function() {
    if (cache[arguments[0]]!==undefined) {
      return cache[arguments[0]];
    }  
    else {
      var value = fn.apply(this, arguments);
      cache[arguments[0]] = value;  
      return value;
    }
  }
}

现在返回函数,以便可以多次调用它。

用法

function test(a) {
  console.log('calling test', a);
  return a + 1;
}

const memoized = memoize(test);

memoized(1); // prints calling test and returns 2
memoized(1); // returns 2
memoized(2); // prints calling test and returns 3

答案 1 :(得分:0)

我设法在AnilRedshift的建议之后修复我的代码。以下是固定代码。

function memoize(fn) {
  var cache = {};
  return function() {
    var key = JSON.stringify(arguments);
    if (cache[key]) {
      console.log('cache used');
      return cache[key];
    }  
    else {
      var value = fn.apply(this, arguments);
      cache[key] = value;
      console.log('cache not used');
      return value;
    }
  };  
}

var fibonacciMemoized = memoize(function(n) {
    //1,1,2,3,5,8,13,21,34
    if(i<=2)
      return 1;

    var fib = [0,1,1];
    for(var i=3;i<=n;i++) {
      fib[i] = fibonacciMemoized(i-2)+fibonacciMemoized(i-1);
    }

    return fib[n];
});

console.log(fibonacciMemoized(7));

console.log(fibonacciMemoized(9));