(请注意,我将问题放在这里是因为它是关于它的概念机制,而不是编码问题)
我当时正在开发一个小型程序,该程序在其等式中使用了斐波那契数列,但是我注意到,如果超过一定数,它会变得非常缓慢,在谷歌上徘徊了一段时间,我偶然发现了Haskell中一种称为的技术Memoization
,他们展示了这样的代码:
-- Traditional implementation of fibonacci, hangs after about 30
slow_fib :: Int -> Integer
slow_fib 0 = 0
slow_fib 1 = 1
slow_fib n = slow_fib (n-2) + slow_fib (n-1)
-- Memorized variant is near instant even after 10000
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
所以我对你们的问题是,为什么或如何运作?
是因为它以某种方式设法在计算赶上之前遍历了大多数列表吗?但是,如果haskell很懒惰,那么实际上并不需要进行任何计算...那么它如何工作?
the calculation catches up
吗?顺便说一句,记忆并不是特定于haskell的:en.wikipedia.org/wiki/Memoization