2016-12-29 4 views
0

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にTIntなり、UStringなる(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のクロージャーに置き換えられました)のアイディアとは何かを前提としていますが、実装の構文は私にとってはクリックしません。

+0

関連する可能性のフルfledgesをさらに一歩それに決めたと書いてきました:http://stackoverflow.com/questions/37690663/explanation-for-swift-memoization-call-syntax。 –

答えて

0
+0

徹底したウォークスルー、いい仕事のようですね!ただし、[リンクのみの回答はお勧めできません](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers)それがあなた自身のリンクであっても、それが今から数年後に続くかどうかは分かりません)。あなたはおそらくあなたのブログ投稿からいくつかの部分を引用/ハイライトすることができますか?そうすれば、このSOの答えは、少なくとも短く、このスレッドの質問に答えることができますか?より詳細な情報を得るには、ブログの投稿を参照してください。 – dfri

関連する問題