有人可以向我解释,为什么下面的代码是memoization:
fib_mem :: Int -> Integer
fib_mem = (map fib [0..] !!)
where fib 0 = 1
fib 1 = 1
fib n = fib_mem (n-2) + fib_mem (n-1)
我猜你在问这个如何回忆fib
。 fib
本身只是一个普通的功能。真正的魔法发生在fib_mem = (map fib [0..] !!)
,它记忆fib
。这个表达相当于说fib_mem x = (map fib [0..]) !! x
。让我们分解一下,看看它在做什么:
[0..]
是一个无限的名单,开始[0,1,2,3,..]
和无限的无限。map fib [0..]
将fib
应用于此列表的每个元素,生成一个列表,其中每个元素是与该元素的索引对应的斐波纳契数,因此例如8
是在5
指数。这是重要的一步;它通过将fib
应用于每个数字来记忆!!
,因此一旦特定索引处的值被强制,就不必重新计算它。如果你的意思是“为什么它是一个记忆功能”,CAF (constant applicative form),因为它是一个has a monomorphic type和qazxswpoi。