我通过了解在memoized斐波那契的(简单)版本使用的参数工作在Advanced Swift会议解释(跳转到0点38分00秒)从WWDC 2014搞清楚memoize的 - 会话404
在下面memoize的函数被定义为会话(适于夫特3)
func memoize<T: Hashable, U>(body: @escaping (T) -> U) -> (T) -> U {
var memo = Dictionary<T, U>()
return { x in
if let q = memo[x] { return q }
let r = body(x)
memo[x] = r
return r
}
}
它将包裹简单的函数,例如:
let ntos = memoize {(n: Int) -> String in
print("Must evaluate something")
return "\(n)"
}
print(ntos(3))
print(ntos(3))
print(ntos(30))
输出:
Must evaluate something 3 3 Must evaluate something 30
类型NTOS的是(Int) -> String
所以在memoize的所述T
变得Int
和U
变得String
。
但对于斐波那契功能,例如苹果使用的是
let fibonacci = memoize {
fibonacci, n in
n < 2 ? Double(n) : fibonacci(n: n - 1) + fibonacci(n: n - 2)
}
在这里我不知道什么类型的T,和U适应?以及函数如何表现递归性质?如何将闭合参数声明fibonacci, n
转换为memoize (T) -> U
体型参数?
为什么斐波纳契甚至在闭包的定义中传递给记忆呢?我认为这与curried函数的想法有关(在Swift 3中被闭包取代),但是实现语法不会为我点击。
可能相关:http://stackoverflow.com/questions/37690663/explanation-for-swift-memoization-call-syntax。 –