在我正在做的功能编程课程的当前练习任务中,我们必须编写一个给定函数的记忆版本。解释memoization,给出以下例子:这个memoized斐波纳契函数是如何工作的?
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”?还是仅仅重新使用该值? – user42179 2013-03-21 10:03:36
关于你的相关问题[见本](http://stackoverflow.com/q/15084162/485115)。 – 2013-03-21 10:14:16
啊,它是。谢谢! – user42179 2013-03-21 10:29:46