Ich arbeite die Parameter in der (einfachen) Version der memoized Fibonacci in der Advanced Swift Sitzung erklärt verwendet, um durch das Verständnis (Sprung zum 00.38.00)Herauszufinden memoize von WWDC 2014 - Session 404
In die Sitzung der folgende memoize Funktion (angepasst an 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
}
}
Und es wird wickeln einfache Funktionen, zum Beispiel definiert:
let ntos = memoize {(n: Int) -> String in
print("Must evaluate something")
return "\(n)"
}
print(ntos(3))
print(ntos(3))
print(ntos(30))
Ausgang:
Must evaluate something 3 3 Must evaluate something 30
Die Art der NTO ist (Int) -> String
so die T
in memoize wird Int
und U
String
wird.
Aber für die Fibonacci-Funktion ist das Beispiel Apfel verwenden
let fibonacci = memoize {
fibonacci, n in
n < 2 ? Double(n) : fibonacci(n: n - 1) + fibonacci(n: n - 2)
}
Hier bin ich nicht sicher, welche Arten T und U passen? und wie verhält sich die Funktion für die rekursive Natur? Wie übersetzt sich die Abschlussparameter-Deklaration fibonacci, n
zum Typ memoize (T) -> U
body Parameter?
Warum Fibonacci ist sogar in der Definition der Schließung an Memoize übergeben? Ich nehme an, dass es etwas mit der Idee der Curry-Funktionen zu tun hat (die in Swift 3 durch Verschlusssachen ersetzt wurden), aber die Implementierungssyntax klickt einfach nicht auf mich.
Mögliche verwandten: http://stackoverflow.com/questions/37690663/explanation-for-swift-memoization-call-syntax. –