如何使用Haskell Memoize来解决LCS?

时间:2014-09-13 13:54:49

标签: haskell memoization

以下是代码:

import Data.Function.Memoize

main = do
    let 
        f 0 0 = 0
        f 0 _ = 0
        f _ 0 = 0
        f n m = if a !! n == b !! m
            then 1 + f' (n-1) (m-1)
            else max (f' (n-1) m) (f' n (m-1))

        f' = memoize2 $ f
    print $ length a
    print $ length b
    print $ f (length a - 1) (length b - 1)
    where
        a = "1234helloworld2ffdfdfdf32rg4364jm5"
        b = "03424helloworldfdfdfdfd4353645645jnt"

但问题是我无法全局编写函数,其中字符串a和b作为参数传递给它。好像我改写了

f n m

f a b n m

f' = memoize4 f

该功能将加速。

如何将不应在memoization中使用的参数传递给使用memoize的函数?

所以我写这样的全局函数,它确实有效!

但是如何累积它找到的公共字符串并使用此函数获得最终结果?

lcs a b = f (length a - 1) (length b - 1)
  where
        f 0 0 = 0
        f 0 _ = 0
        f _ 0 = 0
        f n m = if a !! n == b !! m
            then (1 + f' (n-1) (m-1))
            else max (f' (n-1) m) (f' n (m-1))
        f' = memoize2 $ f

0 个答案:

没有答案