树中的垂直和水平递归

时间:2017-02-03 21:25:58

标签: haskell recursion tree

我在Haskell中有一个树数据结构:

data MultTree b = DataNode b | IndexNode Int Int [MultTree b] deriving (Show)

任务是返回树中存在的最大数量的分支(因此IndexNode的最长列表的基数)。

为了达到这个目的,我写了一个函数:

grad :: MultTree t -> Int
grad DataNode _       = 0
grad IndexNode _ _ [] = 0
grad IndexNode _ _ (x:xs)
              | isIndexNodeCheck x = max ((countList (x:xs)) (grad x))

问题:如何实现该功能不仅可以深入了解树级别,还可以检查xs的下一个元素? 如果写另一个保护代码将不会运行,因为Haskell总是采用匹配的第一个模式。

所以目前该函数应该适用于垂直递归,但我想知道如何横向递归。

这是我的完整代码:

data MultTree b = DataNode b | IndexNode Int Int [MultTree b] deriving (Show)

t2 :: MultTree Int
t2 = IndexNode 3 42 [IndexNode 7 8 [DataNode 3, DataNode 5, DataNode 7], DataNode 6, IndexNode 10 23 [DataNode 99, DataNode 78, DataNode 24]]

countList :: [a] -> Int
countList [] = 0
countList (x:xs) = 1 + countList xs

isIndexNodeCheck :: MultTree a -> Bool
isIndexNodeCheck (DataNode _) = False
isIndexNodeCheck (IndexNode _ _ _) = True

grad :: MultTree t -> Int
grad DataNode _       = 0
grad IndexNode _ _ [] = 0
grad IndexNode _ _ (x:xs)
              | isIndexNodeCheck x = max ((countList (x:xs)) (grad x))

1 个答案:

答案 0 :(得分:4)

以下是获取最大分支因子的解决方案:

grad :: MultTree a -> Int
grad (DataNode _) = 0
grad (IndexNode _ _ subtrees) =
  -- take the maximum of this tree and of the 
  -- maximum branching factor of all subtrees
  maximum (length subtrees : map grad subtrees)

关键是我使用grad得到每个子树的map