【问题标题】:vertical and horizontal recursion in a tree树中的垂直和水平递归
【发布时间】: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 是在询问如何根本搜索一棵树的所有分支,而不是按照什么顺序来探索它们。

标签: haskell recursion tree


【解决方案1】:

这是获得最大分支因子的解决方案:

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)

关键是我使用map获取每个子树的grad

【讨论】:

    猜你喜欢
    • 2015-09-05
    • 2013-12-10
    • 1970-01-01
    • 2019-07-19
    • 2015-08-29
    相关资源
    最近更新 更多