【问题标题】:Haskell Tree delete a node / calculate all possible pathsHaskell Tree 删除一个节点/计算所有可能的路径
【发布时间】:2017-05-23 10:41:37
【问题描述】:

我有这些结构:

data Tree = Leaf Points | Branch Points [Tree]
deriving(Eq,Show)

data Design = Design Tree Tree Int
deriving(Eq,Show)

数据类型Tree是数据类型Design的一部分,Design拥有两个Trees

 type Points = [(Int,Int,Int,Int)]

 design = Design mtree btree 180

我必须找到所有可能的路径:

numberPaths :: Design -> Int

并将第三个 IntegerPoints 更改为 180 从 design

type Points = [(Int,Int,Int,Int)]
design = Design mtree btree 180

changeInt :: Design -> Design

【问题讨论】:

  • 你的帖子里没有问题。
  • 我必须在设计树中找到所有可能的路径,并在 Points 中更改一个 Int,然后在设计中再次更改 180。
  • 您已经告诉我们您必须做什么,但您仍然没有告诉我们您遇到问题并需要帮助的部分。

标签: haskell tree


【解决方案1】:

计算路径

为了找到一棵树中的路径数,我们递归地沿着树向下计算每个节点的子路径数,然后将它们相加。所以除了numberPaths作为接口之外,我们还需要另一个辅助函数,其类型签名是Tree -> Int。我们就叫它descend吧。

descend :: Tree -> Int 

我们将 Leaf 视为 1,将 Branch 视为其子树的路径数之和。所以descend 变成:

descend :: Tree -> Int 
descend (Leaf _)            = 1 
descend (Branch _ subtress) = foldr (\tree sum -> sum + descend tree) 0 subtrees 

函数numberPaths只需要调用descend就可以计算出它的两棵树。

numberPaths :: Design -> Int 
numberPaths (Design a b _) = descend a + descend b 

改变诠释

changeInt的类型签名表示没有引入Int值来改变Design类型。我认为这没有意义,所以我冒昧地将其更改为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 

【讨论】:

  • 非常感谢!我的意思是:数据树 = 叶点 |分支点 [Tree] 的类型为 Points = [(Int,Int,Int,Int)],我想在那里更改最后一个 Integer。还有 data Design = Design Tree Tree Int 有 design = Design mtree btree 180 我想改变那个 180。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多