У меня есть функция памятки, которая запоминает рекурсивные функции, которые возвращают сумму, например, Number, но не с моей функцией collatz, которая возвращает массив.Моя карта внутри функции запоминания будет иметь разные ключи, но одно и то же значение, и не будет запоминать каждый шаг функции.Я пытаюсь сохранить эту возможность компоновки настолько, насколько это возможно.
Запись в консоль внутри collatz, чтобы проверить, будет ли она запущена, выйдет из системы в первый раз, как и ожидалось.
Я проверил это на экспоненциальной рекурсивной функции с другой функцией keymaker, которая правильно запоминает.
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
в качестве ключа и запоминать каждый шаг.