1
A
回答
2
这是我的最终答案。经测试,它的工作原理:
rtHeight R a [] = 1
rtHeight R a l = 1 + maximum (map (rtHeight) l)
2
在Why Functional Programming Matters,作者包括代码等同于以下内容:
reduce_tree f g z t =
f (label t) (reduce (g . reduce_tree f g z) z (branches t))
使用它,我们可以写
rtHeight t = reduce_tree f g z t
where
label (R a _) = a
branches (R _ bs) = bs
reduce = foldr
f _ y = 1 + y -- 1 more than maximum height of subtrees
g x y = max x y -- y is maximum height of subtrees to the right
z = 0 -- the smallest height is 0
举例说明,一棵树t = R a [b,c,d]
,这计算t
的高度为
rtHeight t = 1 + max (rtHeight b) -- rtHeight == reduce_tree f g z
(max (rtHeight c)
(max (rtHeight d)
0))
这是因为,对于内置foldr
function,
foldr g z [a,b,c,...,n] == g a (g b (g c (... (g n z)...)))
一个有趣的身份是foldr (g . h) z xs == foldr g z (map h xs)
,并自maximum (xs ++ [0]) == foldr max 0 xs
的rtHeight
您的直接递归形式可以从这个广义的提法被回收。
相关问题
- 1. 哈斯克尔:列表玫瑰树
- 2. 玫瑰树解构
- 3. 合并树哈斯克尔
- 4. 哈斯克尔树列表
- 5. 显示树哈斯克尔
- 6. 用Data.Tree.Zipper遍历玫瑰树
- 7. 哈斯克尔插入特定的树
- 8. 哈斯克尔地图的树木
- 9. 哈斯克尔
- 10. 哈斯克尔
- 11. 哈斯克尔
- 12. Catamorphism和树遍历哈斯克尔
- 13. 哈斯克尔二叉树练习
- 14. 哈斯克尔包 - 依赖关系树
- 15. 哈斯克尔:问题荏苒树
- 16. 哈斯克尔树列表 - 序遍历
- 17. 哈斯克尔 - Huffman解码而不树
- 18. 哈斯克尔非二叉树
- 19. R的玫瑰图
- 20. 玫瑰树在Haskell - 寻找叶
- 21. 如何追加到玫瑰树在斯卡拉
- 22. 在哈斯克尔
- 23. 在哈斯克尔
- 24. 在哈斯克尔
- 25. Control.Monad.Writer哈斯克尔
- 26. 哈斯克尔 - div`
- 27. 在哈斯克尔
- 28. Control.Monad.State哈斯克尔
- 29. zipWith哈斯克尔
- 30. 在哈斯克尔
你太亲近了!只需混合搭配:从增加关卡的一个解决方案中取出一点,并从处理列表的另一个解决方案中取出一点。 (并且不要忘记更正括号。) –