let memoize =
(fun: (x: number) => number) => {
let memo = new Map<number, number>()
return (x: number) => {
let r = memo.get(x)
if (r == undefined) {
r = fun(x)
memo.set(x, r)
}
return r
}
}
function fibonacci(x: number): number {
return (x <= 2) ? 1 :
fibonacci(x - 1) + fibonacci(x - 2)
}
let memFibonacci = memoize(fibonacci)
for (let i of [1, 2]) {
let start = new Date()
let f37 = memFibonacci(37)
let now = new Date()
let milliseconds = now.getTime() - start.getTime()
console.log(`${i}: f37 is ${f37}`);
console.log(`${i}: milliseconds is ${milliseconds}`);
}
// prints:
// 1: f37 is 24157817
// 1: milliseconds is 159
// 2: f37 is 24157817
// 2: milliseconds is 0
let start = new Date()
let f38 = memFibonacci(38);
let now = new Date()
let milliseconds = now.getTime() - start.getTime()
console.log(`f38 is ${f38}`)
console.log(`milliseconds is ${milliseconds}`)
// f38 is 39088169
// milliseconds is 240
| This memoization method works well with non-recursive functions. Because it only remembers the result of the first function call. |