#!/usr/local/bin/swift func memrecall(_ f:@escaping (((T)->R),T)->R)->(T)->R { var r:((T)->R)! var m = [T:R]() r = { t in if let q = m[t] { return q } else { m[t] = f(r,t) } return m[t]! } return r } let fib = memrecall { $1 <= 1 ? $1 : $0($1-2)+$0($1-1) } _ = (0...93).map { print(fib($0)) }