【发布时间】:2018-04-16 09:25:27
【问题描述】:
我想在具有多个不同参数的函数上使用 memoization
function :: (Int, Int) -> [[Int]] -> Int
到目前为止我尝试了什么:
function :: (Int, Int) -> [[Int]] -> Int
function (s, d) matrix = inner (s, d) matrix
where
inner (i, 0) g = g !! (i-1) !! (0)
inner (i, k) g = maximum [memo ! ((i, k-1), g)
,
memo ! ((i-1, k), g)
]
memo = listArray bounds
[inner (i,k) g | ((i,k), g) <- Data.Array.range bounds]
bounds = ( ((1,1), [[1,1]]), ((n,n), [[n,n]]) )
仍然没有按预期工作 - 我收到的消息是:
没有因使用“!”而导致 (Data.Array.Ix [[Int]]) 的实例
【问题讨论】:
-
能否请您创建一个测试用例,这是一个最小、完整和可验证的示例stackoverflow.com/help/mcve
-
记忆一个接受
[[Int]]类型参数的函数是不寻常的,并且您尝试使用的基于数组的方法可能不起作用。错误消息告诉您不能使用[[Int]]作为数组的索引。也许您可以改用Data.Map,但我不知道在这种情况下该推荐什么。 -
使用
(!!)可能会导致大量开销:!! k,在 O(k) 中工作,因此对于较大的k,这将花费大量时间。 -
请解释这段代码应该做什么(伪代码、规范、示例......)。我怀疑你真的想在
[[Int]]类型的键上记忆。 -
基本上,代码是:inner (i, 0) g = g !! (i-1) !! (0) inner (i, k) g = maximum [inner ((i, k-1), g) , inner((i-1, k), g) ] ,没有记忆。我想将 : inner((i-1, k), g / [inner ((i, k-1), g) 的结果存储在一个数组中,使用记忆化。
标签: haskell