haskell中树的最大元素?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了haskell中树的最大元素?相关的知识,希望对你有一定的参考价值。
鉴于一棵树:
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]
但我得到一个错误,我没有找到它。
答案
这里有三个潜在的问题:
- 如果一棵树包含一个或多个
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
。
以上是关于haskell中树的最大元素?的主要内容,如果未能解决你的问题,请参考以下文章