Haskell树删除节点/计算所有可能的路径
我有以下结构:Haskell树删除节点/计算所有可能的路径,haskell,tree,Haskell,Tree,我有以下结构: data Tree = Leaf Points | Branch Points [Tree] deriving(Eq,Show) data Design = Design Tree Tree Int deriving(Eq,Show) 数据类型树是数据类型设计的一部分,设计包含两个树: type Points = [(Int,Int,Int,Int)] design = Design mtree btree 180 我必须找到所有可能的路径: numberPaths
data Tree = Leaf Points | Branch Points [Tree]
deriving(Eq,Show)
data Design = Design Tree Tree Int
deriving(Eq,Show)
数据类型树
是数据类型设计
的一部分,设计
包含两个树
:
type Points = [(Int,Int,Int,Int)]
design = Design mtree btree 180
我必须找到所有可能的路径:
numberPaths :: Design -> Int
并从点更改第三个整数,从设计更改180:
type Points = [(Int,Int,Int,Int)]
design = Design mtree btree 180
changeInt :: Design -> Design
计数路径
为了找到树中的路径数,我们递归地沿着树向下计算每个节点的子路径数,然后将它们相加。因此,除了使用numberPaths
作为接口外,我们还需要另一个辅助函数,其类型签名为Tree->Int
。我们称之为下降
descend :: Tree -> Int
我们将Leaf
计算为1,将Branch
计算为其子树的路径数之和。因此,下降
变为:
descend :: Tree -> Int
descend (Leaf _) = 1
descend (Branch _ subtress) = foldr (\tree sum -> sum + descend tree) 0 subtrees
函数numberPaths
只需要调用down
来计算它的两棵树
numberPaths :: Design -> Int
numberPaths (Design a b _) = descend a + descend b
张茵
changeInt
的类型签名表示没有引入Int
值来更改设计
类型。我认为这是没有意义的,所以我冒昧地将其更改为Int->Design->Design
changeInt
的实现遵循类似的模式。为了改变树,我们递归地遍历树的每一层。我们还引入了一个辅助函数changePoints
changeTree :: Int -> Tree -> Tree
changeTree n (Leaf points) = Leaf $ changePoints n points
changeTree n (Branch points subtrees) = Branch points' subtrees'
where points' = changePoints n points
subtrees' = map (changeTree n) subtrees
changePoints :: Int -> Points -> Points
changePoints n points = map (\(x, y, _, z) -> (x, y, n, z)) points
然后,changeInt
只需调用changeTree
即可完成作业
changeInt :: Int -> Design -> Design
changeInt n (Design mtree btree _) = Design mtree' btree' n
where mtree' = changeTree n mtree
btree' = changeTree n btree
在你的帖子中没有问题。我必须在设计树中找到所有可能的路径,并在点中更改一个Int,然后在设计中再次更改180。你已经告诉我们你必须做什么,但你仍然没有告诉我们你遇到的问题和需要帮助的部分。非常感谢!我的意思是:数据树=叶点|分支点[树]有类型点=[(Int,Int,Int,Int)],我想更改最后一个整数。另外,data Design=Design Tree-Tree-Int有Design=Design-mtree-btree 180,我想更改这个180。