KM8 Ответов: 1

Нужна помощь в понимании функции мемуаризатора Крокфорда


Я пытаюсь понять функцию мемуаризатора Крокфорда. Хотя я могу проследить, как это работает, я не совсем понимаю, как это работает. основополагающий аргумент и внутренняя функция ракушка и как он придумал фундаментальная (оболочка, n); и функция (оболочка, n) {...} Я имею в виду, если бы я сам писал код, что привело бы меня к такому же выводу?

var memoizer = function (memo, fundamental) {
  var shell = function (n) {
    var result = memo[n];
    if (typeof result !== 'number') {
      result = fundamental(shell, n);
      memo[n] = result;
    }
    return result;
  };
  return shell;
};

var fibonacci = memoizer([0, 1], function(shell, n) {
  return shell(n - 1) + shell(n - 2);
});


Интуитивно я бы сделал что - то вроде:

function memoizer(memo, someFormula) {
  var shell = function() {
    // check memo
    // if not in memo
        // run the formula - someFormula();
        // store result in memo
    // return result;
  return shell;
  }  
}

var fibonacci = memoizer([0, 1], function(n) {
  // return fibonacci formula
};


По общему признанию, это не рекурсивно, и я опустил н аргумент. Пока я это знаю ракушка и основополагающий это не одно и то же, меня смущает наложение и то, как они соотносятся друг с другом.

Что я уже пробовал:

Я использовал отладчик, поэтому понимаю, как он работает, но до сих пор не понимаю мотивов, лежащих в основе кода.

Graeme_Grant

Вы пытались связаться с автором? Мемуарист Дугласа Крокфорда · GitHub[^]- Он был бы самым подходящим человеком, чтобы ответить на этот вопрос...

1 Ответов

Рейтинг:
6

Richard Deeming

Вы правы - эта версия слишком сложна. Упрощенная версия будет работать так же хорошо:

var memoizer = function(cachedResults, theRealFunction) {
    return function (n) {
        if (!cachedResults.hasOwnProperty(n)) {
            cachedResults[n] = theRealFunction(n);
        }
        
        return cachedResults[n];
    };
};

var fibonacci = memoizer([0, 1], function(n) {
    console.debug("fibonacci", n);
    return fibonacci(n - 1) + fibonacci(n - 2);
});

То shell параметр был добавлен для того, чтобы рекурсивная функция memoized могла вызывать свою версию memoized. Но так как это уже доступно, хранящееся в fibonacci переменная, нет необходимости передавать ее в качестве параметра.


KM8

Спасибо за это. Мне нравится ваш код. Это более читабельно и интуитивно.