haskell树的深度求法
我想找到haskell树的深度求法,haskell,tree,depth,Haskell,Tree,Depth,我想找到STree的深度,但在我的代码中,它不会计算第一级 data STree = SNode Label [STree] deriving (Eq,Show) tdepth :: STree -> Label tdepth (SNode _ [])= 0 tdepth (SNode l s) = 1 + naiveSumList([tdepth t | t <- s]) naiveSumList :: [Int] -> Label naiveSumList (x:xs)
STree
的深度,但在我的代码中,它不会计算第一级
data STree = SNode Label [STree] deriving (Eq,Show)
tdepth :: STree -> Label
tdepth (SNode _ [])= 0
tdepth (SNode l s) = 1 + naiveSumList([tdepth t | t <- s])
naiveSumList :: [Int] -> Label
naiveSumList (x:xs) = x + (naiveSumList xs)
naiveSumList [] = 0
我的代码示例结果:
tdepth s1 = 0
tdepth s2 = 1
tdepth s3 = 2
tdepth s4 = 3
结果应该是:
tdepth s1 = 1
tdepth s2 = 2
tdepth s3 = 3
tdepth s4 = 4
让我们从基本情况开始。您希望
tdepth(SNode-label[])
返回1
,因此让我们编写该案例:
tdepth :: STree -> Int
tdepth (SNode _ []) = 1
现在我们需要知道如何计算树的深度。树的深度是最长分支上的节点数,而您对函数期望值的示例正是我们要寻找的。因为我们在寻找最长的树枝,所以我们应该找到每个树枝的最大深度。幸运的是,Prelude
已经内置了一个maximum::Ord a=>[a]->a
函数,所以我们可以这样做
tdepth (SNode _ branches) = 1 + maximum [tdepth branch | branch <- branches]
但是,我不喜欢map tdepth branchs
周围的括号,因为我们使用的是Int
,所以我们可以使用succ
函数,它只向传递给它的Int
中添加1:
tdepth (SNode _ branches) = succ $ maximum $ map tdepth branches
但是你可以使用任何你喜欢的版本,这三个版本几乎是相同的
我们现在一起拥有
tdepth :: STree -> Int
tdepth (SNode _ []) = 1
tdepth (SNode _ branches) = 1 + maximum (map tdepth branches)
我还有一个问题,我们重复了我们的逻辑,对于单个节点的深度,有没有办法把这个问题减少到我们需要解决的地方?如果我们不检查基本情况,而是找到一种方法使最大值
返回0
如果分支==[]
,那么我们的函数就不需要两条语句了。不幸的是,如果传递的是空列表,maximum
当前会出现错误,但我们可以非常简单地解决这个问题。我们所要做的就是确保传递给maximum
的列表中始终至少包含一个元素:
tdepth :: STree -> Int
tdepth (SNode _ branches) = 1 + maximum (0 : map tdepth branches)
-- Or if you prefer
-- = succ $ maximum $ 0 : map tdepth branches
我们可以安全地预先将
0
添加到我们的深度,因为我们知道我们的深度将始终大于0,因此在该列表上调用maximum
将返回一个有效的结果。现在我们有了一个表达式,它可以准确地计算树的深度,而无需处理任何特殊情况。请改写您的问题。不清楚您指的是哪种代码,问题中有两种不同的tdepth
实现。好的,我删除了另一种。如果您试图找到树的深度,为什么要汇总每个分支的深度?你不应该在列表中取最大值吗?还有,既然Prelude
中已经存在sum
,为什么还要使用naiveSumList
?@bheklillr,因为我是haskell的新手,我也不知道Prelude。树木真的很复杂,谢谢你的解释。
tdepth :: STree -> Int
tdepth (SNode _ []) = 1
tdepth (SNode _ branches) = 1 + maximum (map tdepth branches)
tdepth :: STree -> Int
tdepth (SNode _ branches) = 1 + maximum (0 : map tdepth branches)
-- Or if you prefer
-- = succ $ maximum $ 0 : map tdepth branches