2016-12-29 1 views
0

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 UString 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.

+0

Mögliche verwandten: http://stackoverflow.com/questions/37690663/explanation-for-swift-memoization-call-syntax. –

Antwort

0

Ich habe einen Schritt weiter entschieden, und schrieb eine volle flügge walk through of memoize

+0

Scheint wie ein gründlicher Spaziergang, nette Arbeit! Beachten Sie jedoch, dass [Link-only-Antworten werden hier nicht empfohlen] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really- good-answers) hier auf SO (selbst wenn es Ihr eigener Link ist, wissen wir nicht, ob es in ein paar Jahren fortbesteht); Könntest du vielleicht einige Teile aus deinem Blogbeitrag zitieren/hervorheben, damit diese SO Antworten beantwortet, zumindest kurz die Frage dieses Threads? Sie können auf Ihren Blogpost für eine ausführlichere Berichterstattung verweisen. – dfri

Verwandte Themen