がAdvanced Swiftセッションで説明したセッション(夜12時38分00秒にジャンプ)WWDC 2014からmemoizeを考え出す - 私はメモ化フィボナッチの(簡単な)バージョンで使用されるパラメータを理解して働いている404
で次memoize関数が定義されているセッションは
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
}
}
(スウィフト3に適応)そして、それは例えば、単純な関数をラップします:
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の種類はこれmemoizeにT
がInt
なり、U
がString
なる(Int) -> String
あります。
しかし、フィボナッチ機能のために、例えば、リンゴを使用している
は私がTどのタイプか分からない。ここlet fibonacci = memoize {
fibonacci, n in
n < 2 ? Double(n) : fibonacci(n: n - 1) + fibonacci(n: n - 2)
}
あり、そしてUは適応されますか?どのように関数が再帰的な性質のために振る舞うか?クロージャーパラメーター宣言fibonacci, n
は、ボディーパラメーターmemoize (T) -> U
に変換されますか?
memoizeに渡されたクロージャの定義にフィボナッチがあるのはなぜですか?私はそれがカリー化された関数(Swift 3のクロージャーに置き換えられました)のアイディアとは何かを前提としていますが、実装の構文は私にとってはクリックしません。
関連する可能性のフルfledgesをさらに一歩それに決めたと書いてきました:http://stackoverflow.com/questions/37690663/explanation-for-swift-memoization-call-syntax。 –