此页面上显示了以下使用 memoization 的函数示例:
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
但是,如果我们想记住一个多参数函数怎么办?例如,我们可以创建一个“乘法斐波那契”,定义为f(m,n) = m*f(m,n-2) + m*f(m,n-1)
. 我为这个“乘法斐波那契”函数修改了上面的代码,如下所示:
mult_fib :: Integer -> Int -> Integer
mult_fib mult = (map (m_fib mult) [0..] !!)
where m_fib _ 0 = 0
m_fib _ 1 = 1
m_fib m n = m*(mult_fib m (n-2)) + m*(mult_fib m (n-1))
修改后的函数的运行时间是指数的,即使原始函数是线性的。为什么这种技术在第二种情况下不起作用?另外,如何修改函数以利用记忆(不使用库函数)?