func memoize<T:Hashable,U>(block:(T->U,T)->U) -> T -> U {
var memo = Dictionary<T,U>()
var result:(T->U)!
result = { x in
if let q = memo[x] { return q }
let r = block(result, x)
memo[x] = r
return r
}
return result
}
let faktoriál = memoize { f, n in n <= 1 ? 1 : n * f(n - 1) }