2015-05-22 1 views
3

Я столкнулся с этой проблемой memoize. Мне нужно создать функцию, которая будет проверять, было ли значение уже вычислено для данного аргумента, вернуть предыдущий результат или запустить вычисление и вернуть это значение.Как создать функцию memoize

Я потратил часы на это, и пока я новичок в JS. Я не могу понять, как это сделать. Я не могу использовать какие-либо встроенные функции и действительно хотел бы понять, что мне нужно делать.

Вот что у меня до сих пор, что так неправильно, что на данный момент он выглядит как псевдокод. Я искал существующие вопросы о мемуазе, но я пока не могу сделать какое-либо решение. Буду признателен за любую оказанную помощь.

myMemoizeFunc = function(passedFunc) { 
    var firstRun = passedFunc; 
    function check(passedFunc){ 
    if(firstRun === undefined){ 
     return passedFunc; 
    }else{return firstRun;} 
    } 
    }; 

Извините, я должен был быть более ясным. Вот мои особые требования: myMemoizeFunc должен вернуть функцию, которая проверит, был ли вычисление уже рассчитано для данного аргумента и, если возможно, возвращает значение val. ПропущенныйFunc - это функция, которая содержит результат вычисления. Я понимаю, что это может показаться дубликат, но я отмечаю, что это не так, поскольку у меня есть некоторые серьезные трудности с пониманием того, что я должен делать здесь, и нужна дополнительная помощь, чем в других сообщениях. Это то, что мой процесс мышления приносит мне, но снова, я ухожу.

myMemoizeFunc = function(passedFunc) { 
var allValues = []; 
return function(){ 
    for(var i = 0; i < myValues.length; i++){ 
     if(myValues[i] === passedFunc){ 
      return i; 
     } 
     else{ 
      myValues.push(passedFunc); 
      return passedFunc; 
     } 
    } 
    } 
}; 

я не должен возвращаться я или passedFunc здесь, но что еще я мог сделать в пределах, если/иначе при проверке значения? Я долгое время рассматривал эту проблему, я начинаю реализовывать код, который является смешным и нуждается в свежих советах.

+0

возможно дубликат [Как подчеркивание memoize реализован в JavaScript] (http://stackoverflow.com/questions/24486856/how-underscore-memoize- is-implement-in-javascript) – b4hand

+0

Создайте объект и используйте значение, которое вы хотите вычислить как ключ. Проверьте объект, чтобы узнать, существует ли значение в объекте, если оно его использует. Если не рассчитать, сохраните значение и верните его. – epascarello

+0

Вам не хватает «запустить шаг вычисления», а также нужно разработать метод для доступа к «предыдущему результату», чтобы он мог быть возвращен позже. – Bergi

ответ

7

Я думаю, что основным трюком для этого является создание объекта, в котором хранятся аргументы, которые были переданы ранее, в качестве ключей с результатом функции как значения.

Для memoizing функции одного аргумента, я бы реализовать так:

var myMemoizeFunc = function (passedFunc) { 
    var cache = {}; 
    return function (x) { 
     if (x in cache) return cache[x]; 
     return cache[x] = passedFunc(x); 
    }; 
}; 

Тогда вы могли бы использовать это, чтобы memoize любую функцию, которая принимает один аргумент, скажем, например, рекурсивную функцию для вычисления факториалы:

var factorial = myMemoizeFunc(function(n) { 
    if(n < 2) return 1; 
    return n * factorial(n-1); 
}); 
+1

Как бы вы его кэшировали, если у вас было несколько аргументов? – AlanH

+0

@AlanH Просто используйте массив и сохраните массив аргументов в кеше. –

+0

Я немного неясен в ответе - Откуда взялся х? –

 Смежные вопросы

  • Нет связанных вопросов^_^