【发布时间】:2017-06-21 08:32:42
【问题描述】:
我在 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))
【问题讨论】:
-
了解 DFS 和 BFS。
-
这个有用的建议怎么样?我们不是在搜索任何东西,而是在遍历,无论是广度优先还是深度优先,都不会影响正确性。
-
@amalloy DFS = "垂直递归"。 BFS="水平"。因此,至少拥有正确的术语是有帮助的。 BFS 是我相信 OP 真正在寻找的东西。
-
@amalloy 也许,如果您发现这里的“搜索”具有误导性,那么正式正确的名称将是 BFS 的“级别顺序遍历”和 DFS 的“后/前/按顺序”遍历.但我认为这些更正确的术语更不常用且更令人困惑。
-
如果您阅读 OP 为他认为的“垂直递归”编写的代码,很明显这并不意味着 DFS,因为目前最好将实现称为“仅深度”搜索,其中代码只探索最左边的分支。 OP 是在询问如何根本搜索一棵树的所有分支,而不是按照什么顺序来探索它们。