【发布时间】:2011-09-30 21:12:46
【问题描述】:
我已经为此苦苦挣扎了一段时间。我正在解决 Haskell 中最长的公共子序列问题作为学习练习。
我有一个函数f1,它传递了两个整数i 和j,还有一个函数f2。 f1 构建一个二维列表,使得列表中的 (i,j) 位置等于 f2 i j。
现在我正在尝试编写一个名为lcs 的函数,它接受两个字符串s1 和s2,并使用f1 查找最长的公共子序列以进行记忆。
我不确定如何设置。有什么想法吗?
代码:
f1 :: Int -> Int -> (Int -> Int -> a) -> [[a]]
f2 :: Int -> Int -> a
lcs:: String -> String -> Int
【问题讨论】:
-
我不完全明白
f1和f2的作用。是否可以发布代码?以下是我理解的类型签名:f1 :: Int -> Int -> a;f2 :: Int -> Int -> a。有什么区别? -
@AndresRiofrio:也许 xcross 的意思是
f1 :: (Int -> Int -> a) -> [[a]]s.t.f1 f2 !! i !! j == f2 i j. -
@rampion:
f1 :: Int -> Int -> (Int -> Int -> a) -> [[a]]和f2 :: Int -> Int -> a怎么样?这样f1 _ _ f2 !! i !! j == f2 i j. -
@AndresRiofrio 添加了一些代码。谢谢大家。
-
先递归求解(如维基百科上的定义(未实现)),不用担心指数时间。然后,在正确实施之后,返回并记忆(有各种技术,但这是另一个 SO 问题的素材)。
标签: haskell