我怎样才能在Haskell中找到分支的深度?

时间:2017-05-17 18:47:44

标签: haskell

我想实现一个函数,它给出了树中每个分支的深度,并在列表中打包深度的整数。 我知道如何找到最大值和最小值,但我不知道如何找到其他值。

我的代码示例树:

创建我的树:

data NBaum a = NBlatt a | NKnoten a [NBaum a]
  deriving(Eq,Show)

示例树:

NKnoten "Sonne"[NKnoten "Jupiter" [NBlatt "Io", NBlatt "Europa", NBlatt "Ganymed", NBlatt "Kallisto"],NKnoten "Mars" [NBlatt "Phobos", NBlatt "Deimos"],NBlatt "Merkur", NBlatt "Venus", NKnoten "Erde" [NBlatt "Mond"]]

最大深度:

tdepth (NBlatt a) = 1
tdepth (NKnoten _ b) = 1 + maximum [tdepth branch | branch <- b]

最小深度:

tdepth (NBlatt a) = 1
tdepth (NKnoten _ b) = 1 + minimum [tdepth branch | branch <- b]

示例树的解决方案,我将拥有:[2,2,3,3,3,3,3,3,3]。列表的元素可以有另一个订单。

3 个答案:

答案 0 :(得分:1)

我离开了递归调用未实现或许这个shell可能会有所帮助:

depths :: (Num b) => NBaum a -> [b]
depths = go 1
  where
    go n (NBlatt _) = [n]
    go n (NKnoten _ xs) = error "depths.go: not implemented"

答案 1 :(得分:0)

听起来好像你想为自己解决这个问题,但这里有一个提示:你有没有编写有序或深度优先的遍历函数?

您可以为遍历功能提供另一个记住深度的参数。每次递归调用都会增加它。不要将节点的内容添加到列表中,而是添加深度。

如果还没有达到这个目的,那么编写该函数的一个好方法是添加一个构造列表的累积参数。从具有空列表和深度1的根开始,每次点击叶节点时,都会将当前深度附加到列表的末尾。在父节点,您将当前深度与从调用女儿的函数返回的列表连接起来。

答案 2 :(得分:0)

请检查一下。我们的想法是将相同的函数应用于NKnoten中的每个子节点,并使用concat将结果合并到一个列表中。

depths :: (Num b) => NBaum a -> [b]
depths = go 1
  where
    go n (NBlatt _) = [n]
    go n (NKnoten _ xs) = concat (map (go (n+1)) xs)
相关问题