我在Haskell的第一次练习中遇到了另一个问题。 为了理解这种范式的递归,我想解决这个问题:
给出Elem如下定义的项目列表:
data Elem = Star | War
计算" War"
的最长序列的长度maxWarSeq :: [Elem] -> Int
maxWarSeq [] = 0
maxWarSeq (Star:xs) = 1 + maxWarSeq xs
maxWarSeq (War:xs) = maxWarSeq xs
这种方式我计算序列总数,但我不知道你如何计算#34;最长的"。 有了支持功能,我可以解决问题,但我需要帮助。
列表示例:
testElem = [Star, War, War, Star, Star, War, War, War, Star, Star, War]
结果应为" 3"。
你能帮我吗?
答案 0 :(得分:1)
在进行递归时,你必须考虑在程序的每次调用中你需要的变量来进行“状态”。在这种情况下,为了查看最大序列,您需要“携带”当前最大值和全局最大值。然后在最后一个序列中,您应该决定是否有新的最大值。我已经使用辅助函数实现了一个解决方案:
data Elem = Star | War
testElem = [Star, War, War, Star, Star, War, War, War, Star, Star, War]
maxWarSeq_hlp :: Int -> Int -> [Elem] -> Int
maxWarSeq_hlp curmax prevmax [] = max curmax prevmax
maxWarSeq_hlp curmax prevmax (War:xs) = maxWarSeq_hlp (curmax+1) prevmax xs
maxWarSeq_hlp curmax prevmax (Star:xs) = maxWarSeq_hlp 0 (max curmax prevmax) xs
maxWarSeq :: [Elem] -> Int
maxWarSeq list = maxWarSeq_hlp 0 0 list
基本上我从 curmax 开始, prevmax 为0,然后每次看到战争>时我都会加1到 curmax strong>每次看到 Star 时,我将 curmax 计数重置为零,并将 prevmax 设置为 curmax 的最大值>和 prevmax