2016-12-29 67 views
0

我通过了解在memoized斐波那契的(简单)版本使用的参数工作在Advanced Swift会议解释(跳转到0点38分00秒)从WWDC 2014搞清楚memoize的 - 会话404

在下面memoize的函数被定义为会话(适于夫特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变得IntU变得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体型参数?

为什么斐波纳契甚至在闭包的定义中传递给记忆呢?我认为这与curried函数的想法有关(在Swift 3中被闭包取代),但是实现语法不会为我点击。

+0

可能相关:http://stackoverflow.com/questions/37690663/explanation-for-swift-memoization-call-syntax。 –

回答

0

我决定把它更进一步,写了满满fledges walk through of memoize

+0

看起来像一个彻底的步行,不错的工作!但请注意,在此SO(仅限于链接的答案)(http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers)即使它是你自己的链接,我们也不知道它是否会在几年后仍然存在);你能引用/突出你的博客文章中的一些部分,这样至少可以简单地回答这个问题吗?你可以参考你的博客文章以获得更详细的报道。 – dfri