我正在努力了解Advanced Swift会话中解释的memoized fibonacci(简单)版本中使用的参数(跳转到00:38:00)
在会话中,定义了以下memoize函数(适用于Swift 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
body参数?
为什么fibonacci甚至在传递给memoize的闭包定义中?我认为它与curried函数的概念有关(在Swift 3中被闭包取代)但实现语法对我来说没有点击。