Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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_Depth - Fatal编程技术网

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