在阅读了memoization 介绍之后,我使用更通用的 memoize 函数重新实现了 Fibonacci 示例(仅用于学习目的):
memoizer :: (Int -> Integer) -> Int -> Integer
memoizer f = (map f [0 ..] !!)
memoized_fib :: Int -> Integer
memoized_fib = memoizer fib
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
这可行,但是当我将最后一行更改为以下代码时,记忆突然无法按预期工作(程序再次变慢):
fib n = memoizer fib (n-2) + memoizer fib (n-1)
记忆化的关键区别在哪里?