Haskell中的递归:支持函数

时间:2015-03-19 16:55:39

标签: haskell recursion

我在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"。

你能帮我吗?

1 个答案:

答案 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