У меня есть функция мемоизации, которая запоминает рекурсивные функции, возвращающие сумму, например Number, но не с моей функцией collatz, которая возвращает массив. Моя карта внутри функции мемоизации будет иметь разные ключи, но одно и то же значение, и не запоминать каждый шаг функции. Я стараюсь, чтобы это было возможно компонуемым.
Вход в консоль внутри collatz для проверки того, запущен ли он, приведет к выходу из системы в первый раз, как и ожидалось.
Я тестировал это на экспоненциальной рекурсивной функции с другой функцией клавишного инструмента, которая правильно запоминает.
const memoized = (fn, keymaker = JSON.stringify) => {
const lookupTable = new Map();
return function (...args) {
const key = keymaker.call(this, args);
return lookupTable[key] || (lookupTable[key] = fn.apply(this, args));
}
};
const ignoreOthers = ([...values])=>{
return JSON.stringify(values.shift())
}
const memCollatz = memoized((n,arr=[]) =>{
//console.log('ran')
if (n<=1) return arr.concat(1)
else if(n %2 === 0) return memCollatz(n / 2,arr.concat(n))
else return memCollatz((n*3)+1,arr.concat(n))
},ignoreOthers)
console.log(memCollatz(5))
console.log(memCollatz(6))
console.log(memCollatz(6))
/*
Map {
'1': [ 5, 16, 8, 4, 2, 1 ],
'2': [ 5, 16, 8, 4, 2, 1 ],
'3': [ 5, 16, 8, 4, 2, 1 ],
'4': [ 5, 16, 8, 4, 2, 1 ],
'5': [ 5, 16, 8, 4, 2, 1 ],
'6': [ 5, 16, 8, 4, 2, 1 ],
'8': [ 5, 16, 8, 4, 2, 1 ],
'10': [ 5, 16, 8, 4, 2, 1 ],
'16': [ 5, 16, 8, 4, 2, 1 ] }
*/
После запуска указанных выше журналов консоли моя карта выглядит так, но должна иметь n
в качестве ключа и запоминать каждый шаг.
const memCollatz = memoized(const memCollatz
здесьconst
ошибка, это опечатка? Может быть, вы могли бы сделать это исполняемым сниппетом? - person Mark   schedule 24.12.2018