import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠ Ġval Ġmem fib Ġ= Ġmemo ize (:: fib ) ĊĠ Ġval Ġq qq Ġ= Ġ:: fib . memo ized () ĊĠ Ġfor Ġ( k Ġin Ġ 1 .. 1 0 0 0 ) Ġ{ ĊĠĠĠ Ġval Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġval Ġresult Ġ= Ġmem fib ( k ) ĊĠĠĠ Ġval Ġend Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġval Ġduration Ġ= Ġend Ġ- Ġstart ĊĠĠĠ Ġprintln (" fib ($ k ) =$ result Ġtook Ġ$ duration Ġms ") ĊĠ Ġ} Ċ } Ċ Ċ val Ġmap Ġ= Ġmutable Map Of < Int , ĠLong >() Ċ Ċ fun Ġmem fib ( k : ĠInt ): ĠLong Ġ{ ĊĠ Ġreturn Ġmap . get Or Put ( k ) Ġ{ ĊĠĠĠ Ġwhen Ġ( k ) Ġ{ ĊĠĠĠĠĠĠ 0 Ġ-> Ġ 1 ĊĠĠĠĠĠĠ 1 Ġ-> Ġ 1 ĊĠĠĠĠĠ Ġelse Ġ-> Ġmem fib ( k Ġ- Ġ 1 ) Ġ+ Ġmem fib ( k Ġ- Ġ 2 ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun Ġ< A , ĠR > Ġmemo ize ( fn : Ġ( A ) Ġ-> ĠR ): Ġ( A ) Ġ-> ĠR Ġ{ ĊĠ Ġval Ġmap Ġ= ĠConcurrent HashMap < A , ĠR >() ĊĠ Ġreturn Ġ{ Ġa Ġ-> ĊĠĠĠ Ġmap . get Or Put ( a ) Ġ{ ĊĠĠĠĠĠ Ġfn ( a ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun Ġ< A , ĠR > ĠFunction 1 < A , ĠR >. memo ized (): Ġ( A ) Ġ-> ĠR Ġ{ ĊĠ Ġval Ġmap Ġ= ĠConcurrent HashMap < A , ĠR >() ĊĠ Ġreturn Ġ{ Ġa Ġ-> ĊĠĠĠ Ġmap . get Or Put ( a ) Ġ{ ĊĠĠĠĠĠ Ġthis . invoke ( a ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }