import java.util.concurrent.ConcurrentHashMap fun main(args: Array) { val memfib = memoize(::fib) val qqq = ::fib.memoized() for (k in 1..1000) { val start = System.currentTimeMillis() val result = memfib(k) val end = System.currentTimeMillis() val duration = end - start println("fib($k)=$result took $duration ms") } } val map = mutableMapOf() fun memfib(k: Int): Long { return map.getOrPut(k) { when (k) { 0 -> 1 1 -> 1 else -> memfib(k - 1) + memfib(k - 2) } } } fun memoize(fn: (A) -> R): (A) -> R { val map = ConcurrentHashMap() return { a -> map.getOrPut(a) { fn(a) } } } fun Function1.memoized(): (A) -> R { val map = ConcurrentHashMap() return { a -> map.getOrPut(a) { this.invoke(a) } } }