Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的递归:支持函数_Haskell_Recursion - Fatal编程技术网

Haskell中的递归:支持函数

Haskell中的递归:支持函数,haskell,recursion,Haskell,Recursion,在Haskell的第一次练习中,我还有一个问题。 为了理解这个范例的递归,我想解决这个问题: 给出一个项目列表,Elem定义如下: data Elem = Star | War 计算“战争”最长序列的长度 我用这种方法计算序列总数,但我不知道如何只计算“最长的”。 有了支持功能,我可以解决这个问题,但我需要帮助 列表示例: testElem = [Star, War, War, Star, Star, War, War, War, Star, Star, War] 结果应该是“3” 你能帮我

在Haskell的第一次练习中,我还有一个问题。 为了理解这个范例的递归,我想解决这个问题:

给出一个项目列表,Elem定义如下:

data Elem = Star | War
计算“战争”最长序列的长度

我用这种方法计算序列总数,但我不知道如何只计算“最长的”。 有了支持功能,我可以解决这个问题,但我需要帮助

列表示例:

testElem = [Star, War, War, Star, Star, War, War, War, Star, Star, War]
结果应该是“3”


你能帮我一下吗?

在执行递归时,你必须考虑在程序的每次调用中需要哪些变量才能执行“状态”。在这种情况下,为了查看最大顺序,您需要“携带”当前最大值和全局最大值。然后在序列的最后,您应该决定是否有一个新的最大值。我已经使用助手函数实现了一个解决方案:

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开始,然后每次看到War时,我都向curmax添加1,每次看到Star时,我都将curmax计数重置为零,并将prevmax设置为curmax和prevmax的最大值

这几乎与所问(并回答)的问题完全相同今天早些时候。解决此问题的一种方法是认识到您可能想知道
War
s的当前序列有多长,以及找到的最长序列有多长。解决此问题的另一种方法是将列表分解为其
War
序列(或其长度)然后找到最长的一个。
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