我在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))
答案 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
。