Haskell中给定树的最大分枝数
我是哈斯克尔的初学者。这里我试图理解一个Haskell函数,它计算树的最大分支度 以下是数据类型:Haskell中给定树的最大分枝数,haskell,tree,Haskell,Tree,我是哈斯克尔的初学者。这里我试图理解一个Haskell函数,它计算树的最大分支度 以下是数据类型: data Tree a = Node a [Tree a] deriving (Show) leaf :: a -> Tree a leaf a = Node a [] 以下是实施方案: maxBranching :: Tree a -> Int maxBranching (Node _ ts) = let localBranching = length ts in
data Tree a = Node a [Tree a] deriving (Show)
leaf :: a -> Tree a
leaf a = Node a []
以下是实施方案:
maxBranching :: Tree a -> Int
maxBranching (Node _ ts) = let localBranching = length ts in
max localBranching (maxBranchingOfSubtrees ts)
where maxBranchingOfSubtrees :: [Tree a] -> Int
maxBranchingOfSubtrees [] = 0
maxBranchingOfSubtrees (x:xs) = max (maxBranching x) (maxBranchingOfSubtrees xs)
以下是示例输入:
Node 2 [leaf 7, Node 3 [leaf 0], Node 1 [leaf 3, leaf 2]]
我不理解这个表达:
maxBranchingOfSubtrees (x:xs) = max (maxBranching x) (maxBranchingOfSubtrees xs)
max是如何将第一个元素与列表的其余元素进行比较的,每次迭代后它在哪里更新max?如果我看到列表的第一个元素Leaf 7将作为maxBranching x传递,那么就没有这种情况,它如何返回列表第一个元素的长度,然后maxBranchingGofsubtress如何处理列表的其余部分?然而,首先localBranching包含列表长度=4?任何形式的详细帮助都将不胜感激 对你的问题的简单回答是,所有类型都完美地结合在一起 如果x:xs::[Tree a],那么x::Tree a和xs:[Tree a],因为:::a->[a]->[a],或者具体地说,这里是:::Tree a->[Tree a]->[Tree a]: 从函数的签名中我们得到了
maxBranching :: Tree a -> Int
x :: Tree a
---------------------------------
(maxBranching x) :: Int
及
那么我们真的可以
max :: Int -> Int -> Int
max (maxBranching x) (maxBranchingOfSubtrees xs) :: Int
因此max没有将第一个元素与列表中的其他元素进行比较。相反,它将第一个元素上计算maxBranching的结果与列表其余部分上计算MaxBranchingOffSubtrees的结果进行比较
最后一点,你会问,它怎么知道怎么做?只需使用相同的maxBranchingOfSubtrees配方。换句话说,通过做同样的事情——但这次用的是比以前更小的事情。列表的尾部是列表的一部分
因此,最终这个递归将运行它的过程,我们将得到我们的答案-如果树的列表不是无限的,也就是说。所以这假设分支因子不是无限的
这样就可以找到一个节点的子树的最大分支因子,然后将其与这个节点的分支因子进行比较,从而得出整体上的最大值
另一种观点是
maxBranchingOfSubtrees [] = 0
maxBranchingOfSubtrees (x:xs) = max (maxBranching x) (maxBranchingOfSubtrees xs)
= (max . maxBranching) x (maxBranchingOfSubtrees xs)
符合foldr模式
这符合映射模式
maxBranchingOfSubtrees = foldr max 0 . map maxBranching
还有一个内置的功能
maxBranchingOfSubtrees = maximum . (0 :) . map maxBranching
把它代入我们得到的主函数
maxBranching :: Tree a -> Int
maxBranching (Node _ ts) = max (length ts) (maxBranchingOfSubtrees ts)
= max (length ts) (maximum (0 : map maxBranching ts))
= maximum (length ts : map maxBranching ts)
它使用高阶函数来表示相同的算法,而不是手动递归循环。什么是leaf?这不是树的定义的一部分;我假设它是一个像leaf x=Node x[]?FWIW这样的辅助函数,我将这个函数拼写为maxBranching Node ts=maximum length ts:map maxBranching ts。是的,你假设正确。它被定义为智能构造函数leaf::a->Tree a leaf x=Node x[]@Sniper请将问题详细信息包含在问题部分,而不是评论部分。
maxBranchingOfSubtrees = foldr max 0 . map maxBranching
maxBranchingOfSubtrees = maximum . (0 :) . map maxBranching
maxBranching :: Tree a -> Int
maxBranching (Node _ ts) = max (length ts) (maxBranchingOfSubtrees ts)
= max (length ts) (maximum (0 : map maxBranching ts))
= maximum (length ts : map maxBranching ts)