【发布时间】:2013-03-10 18:20:44
【问题描述】:
在我正在做的函数式编程课程的当前练习作业中,我们必须制作一个给定函数的记忆版本。为了解释memoization,给出下面的例子:
fiblist = [ fibm x | x <- [0..]]
fibm 0 = 0
fibm 1 = 1
fibm n = fiblist !! (n-1) + fiblist !! (n-2)
但我不完全理解这是如何工作的。
让我们打电话给fibm 3。
fibm 3
--> fiblist !! 2 + fibList 1
--> [fibm 0, fibm 1, fibm 2] !! 2 + [fibm 0, fibm 1] !! 1
--> fibm 2 + fibm 1
--> (fiblist !! 1 + fiblist 0) + 1
--> ([fibm 0, fibm 1] !! 1 + [fibm 0] !! 0) + 1
--> (fibm 1 + fibm 0) + 1
--> 1 + 0 + 1
--> 2
从其他问题/答案和谷歌搜索中,我了解到不知何故,评估的 fiblist 在呼叫之间共享。
这是否意味着,例如,对于fiblist !! 2 + fiblist !! 1,列表值只为fiblist !! 2 计算一次,然后只为fiblist !! 1 重复使用?
那么这两个斐波那契数每次调用只计算一次,因此没有指数调用次数。但是fiblist 函数中调用的“较低”级别呢?他们如何从原始fibm 调用中计算出的fiblist 中受益?
【问题讨论】:
-
一个相关的问题,当然已经在 S.O. - 现在看 - 是关于惰性评估。考虑
if (f x) > 0 then f x else 0,其中f x是一些昂贵的函数调用。如果 if 条件为真,是否会重新计算f x,还是会简单地重用该值? -
关于您的相关问题see this.
-
啊,就是这样。谢谢!
-
顺便说一句,即使列表已经被评估,
fiblist !! n也将是O(n),我相信第一次计算fibm n会为每个i < n评估fiblist !! i,这是O(n^2)。你可以做得更好... -
a 边界重复相关问题:stackoverflow.com/questions/11466284/….
标签: haskell fibonacci memoization