Skip to content

Instantly share code, notes, and snippets.

@jcnm
Created June 22, 2016 03:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jcnm/585bdf104e3c2599f57cff29bb1f9428 to your computer and use it in GitHub Desktop.
Save jcnm/585bdf104e3c2599f57cff29bb1f9428 to your computer and use it in GitHub Desktop.
// Naive memoize function
/// MARK - Memoize
func memo_rec<In: Hashable, Out>(yf f: ((In) -> Out) -> ((In) -> Out)) -> ((In) -> Out) {
var hash = [In: Out]()
func aux(_ x: In) -> Out {
if let hf = hash[x] {
return hf
} else {
let y = f(aux)(x) // (f aux: (In) -> Out):(In) -> Out
hash[x] = y
return y
}
}
return aux
}
/// Sample Usage
public let fib = memo_rec { (f: ((Int) -> Double)) -> ((Int) -> Double) in
return { (i:Int) in
if i < 2 {
return Double(i)
} else {
return (f(i - 1) + f(i - 2))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment