为什么它是一个记忆功能?

问题描述 投票:2回答:2

有人可以向我解释,为什么下面的代码是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) 
haskell
2个回答
5
投票

我猜你在问这个如何回忆fibfib本身只是一个普通的功能。真正的魔法发生在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应用于每个数字来记忆!!,因此一旦特定索引处的值被强制,就不必重新计算它。
  • 然后the answer is用于从列表中获取相应索引的值。

0
投票

如果你的意思是“为什么它是一个记忆功能”,CAF (constant applicative form),因为它是一个has a monomorphic type和qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.