Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中给定树的最大分枝数_Haskell_Tree - Fatal编程技术网

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

我是哈斯克尔的初学者。这里我试图理解一个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
                             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)