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. 在哈斯克爾
你太親近了!只需混合搭配:從增加關卡的一個解決方案中取出一點,並從處理列表的另一個解決方案中取出一點。 (並且不要忘記更正括號。) –