【问题标题】:Maximum element on a Tree in haskell?Haskell中树上的最大元素?
【发布时间】:2017-12-17 17:11:02
【问题描述】:

给定一棵树:

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]

但是我得到一个错误,我没有找到它。

【问题讨论】:

  • 请注意,从实际的角度来看,您不必自己定义maxElem;使用DeriveFoldable 扩展,你可以简单地写data Tree a = ... deriving (Show, Foldable),然后像maximum (Node 5 []) 这样的东西会正确返回5。

标签: haskell data-structures tree


【解决方案1】:

这里有三个潜在的问题:

  1. 如果一棵树包含一个或多个Emptys,则会出错。所以Node 1 [Node 4 [], Empty, Node 2 [Node 5 []]] 会引发错误,因为树中有Empty,我们最终会在Empty 上调用maxElem,而我们可以忽略Empty 并因此返回5;
  2. 当您计算带有孩子的Node 的最大值时,您也没有考虑a,而a 也可以是最大值;
  3. 结果也是a,而不是Int

这里实际上有两种情况: 1. 引发错误的Empty 树;和 2. Node x cs 的最大值是x 和孩子的maxElem 的最大值,忽略Emptys

所以我们可以这样写:

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 的情况计算以x 为头,map MaxElem 为尾的列表的maximum,但不是在所有 孩子,但只有匹配Node _ _ 模式的孩子。由于该列表至少包含一个元素x,因此maximum 在空列表上不会出错,我们仅在Node 实例上计算maxElem

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2018-06-11
    • 2011-01-14
    • 2013-12-05
    • 2018-06-29
    • 2014-03-05
    • 2016-05-24
    相关资源
    最近更新 更多