improved
module memoizedeco
import java.lang.System
function memoizer = {
var cache = map[]
return |fun| {
return |args...| {
let key = [fun: hashCode(), Tuple(args)]
if (not cache: containsKey(key)) {
cache: add(key, fun: invokeWithArguments(args))
}
return cache: get(key)
}
}
}
let memo = memoizer()
@memo
function fib = |n| {
if n <= 1 {
return n
} else {
return fib(n - 1) + fib(n - 2)
}
}
@memo
function foo = |n| -> n
local function run = {
let start = System.currentTimeMillis()
let result = fib(40)
let duration = System.currentTimeMillis() - start
println(">>> fib(40) = " + result + " (took " + duration + "ms)")
}
local function run2 = {
let start = System.currentTimeMillis()
let result = foo(40)
let duration = System.currentTimeMillis() - start
println(">>> foo(40) = " + result + " (took " + duration + "ms)")
}
function main = |args| {
foreach i in range(0, 5) {
println("run " + i)
run()
run2()
}
}
Prints:
run 0
>>> fib(40) = 102334155 (took 234ms)
>>> foo(40) = 40 (took 15ms)
run 1
>>> fib(40) = 102334155 (took 3ms)
>>> foo(40) = 40 (took 2ms)
run 2
>>> fib(40) = 102334155 (took 1ms)
>>> foo(40) = 40 (took 1ms)
run 3
>>> fib(40) = 102334155 (took 1ms)
>>> foo(40) = 40 (took 1ms)
run 4
>>> fib(40) = 102334155 (took 1ms)
>>> foo(40) = 40 (took 1ms)
Yeah ! :D