Skip to content

Instantly share code, notes, and snippets.

@codeOfRobin
Created September 29, 2019 15:07
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 codeOfRobin/0f9103227792727f6b0cad5383ba19a2 to your computer and use it in GitHub Desktop.
Save codeOfRobin/0f9103227792727f6b0cad5383ba19a2 to your computer and use it in GitHub Desktop.
func fibonacci(_ number: Int, memoizingDict: inout [Int: Int]) -> Int {
switch number {
case 0:
return 0
case 1:
return 1
default:
let numberMinus1: Int
let numberMinus2: Int
if memoizingDict[number - 1] == nil {
/// to perf test vs a non-memoized version
// var dict: [Int: Int] = [:]
// let x = fibonacci(number - 1, memoizingDict: &dict)
let x = fibonacci(number - 1, memoizingDict: &memoizingDict)
memoizingDict[number - 1] = x
numberMinus1 = x
} else {
numberMinus1 = memoizingDict[number - 1]!
}
if memoizingDict[number - 2] == nil {
/// to perf test vs a non-memoized version
// var dict: [Int: Int] = [:]
// let x = fibonacci(number - 2, memoizingDict: &dict)
let x = fibonacci(number - 2, memoizingDict: &memoizingDict)
memoizingDict[number - 2] = x
numberMinus2 = x
} else {
numberMinus2 = memoizingDict[number - 2]!
}
return numberMinus1 + numberMinus2
}
}
func fibonacci(_ number: Int) -> Int {
var dict: [Int: Int] = [:]
return fibonacci(number, memoizingDict: &dict)
}
print(fibonacci(40))
@codeOfRobin
Copy link
Author

codeOfRobin commented Sep 29, 2019

memoized version: finishes in 0.21s

↪ time swift fibo.swift
102334155
        0.21 real         0.14 user         0.05 sys

vs non memoized

↪ time swift fibo.swift
102334155
      198.13 real       195.54 user         0.43 sys

That's a 1000x difference!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment