给出一棵树:
data Tree a = Empty | Node a [Tree a] deriving Show
我正在尝试获取最大元素,所以我尝试过:
maxElem:: (Ord a) => Tree a -> Int
maxElem Empty = error "maxElem on empty Tree"
maxElem (Node a []) = a
maxElem (Node a x ) = maximum [ maxElem h | h<-x]
但我收到错误而我找不到。
答案 0 :(得分:5)
这里有三个潜在的问题:
Empty
s,则会出错。因此,Node 1 [Node 4 [], Empty, Node 2 [Node 5 []]]
会引发错误,因为树中有Empty
,我们最终会在maxElem
上调用Empty
,而我们可以忽略Empty
因此返回5
; a
的最大值时,您也不会考虑Node
,而a
也可能是最大值; a
,而不是Int
。实际上有两种情况:
1. Empty
树,会引发错误;和
2. Node x cs
的最大值是x
和孩子的maxElem
的最大值,忽略Empty
s 。
所以我们可以把它写成:
maxElem:: Ord a => Tree a -> a
maxElem Empty = error "maxElem on Empty"
maxElem (Node x cs) = maximum (x : map maxElem [c | c@(Node _ _) <- cs])
或者我们可以在列表理解中编写map maxElem
:
maxElem:: Ord a => Tree a -> a
maxElem Empty = error "maxElem on Empty"
maxElem (Node x cs) = maximum (x : [maxElem c | c@(Node _ _) <- cs])
所以基本情况相同,但Node x cs
的情况计算列表的maximum
,其中x
为首,map MaxElem
为尾,但不是在所有子项上,但仅限于与Node _ _
模式匹配的子项。由于此列表包含至少一个元素x
,maximum
在空列表中可能不错误,因此我们仅在maxElem
个实例上计算Node