在我正在做的函数式编程课程的当前练习作业中,我们必须制作一个给定函数的记忆版本。为了解释记忆,给出以下示例:
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 在呼叫之间共享。
这是否意味着,例如 for fiblist !! 2 + fiblist !! 1
,列表值只计算一次 for fiblist !! 2
,然后再重复使用 for fiblist !! 1
?
然后两个斐波那契数每次调用只计算一次,因此没有指数调用次数。但是fiblist
函数中调用的“较低”级别呢?他们如何从fiblist
原始fibm
通话中的计算中受益?