簡體   English   中英

使用折疊操作的Haskell樹

[英]haskell tree using fold operation

給定使用折疊的定義,我將如何編寫一個contains平衡函數。

data Tree a = Tree a [Tree a]

treeFold :: (a -> [b] -> b) -> Tree a -> b
treeContains :: Eq a => a -> Tree a -> Bool
treeBalanced :: Tree a -> Bool

請注意,在上面的定義中,不允許有空樹,並且葉是帶有空子樹列表的樹。

包含函數確定樹是否包含給定標簽。

平衡函數確定樹是否平衡。

如果一棵樹的子樹的高度最大相差一,則該樹是平衡的。

到目前為止,我已經包含了contains函數。

treeContains :: Eq a => a -> Tree a -> Bool
treeContains a = treeFold (\x y -> if a == x then True else ...)

那么,您如何做其他部分呢?

任何幫助將不勝感激。

在您學習時, 我將通過問您更多問題來回答您的問題


Re treeContains

  1. 您要在...計算什么值? 什么意思 它是什么類型?

    ... ,您要查找樹中的下一個節點,然后檢查該節點是否在您要的位置。

    1. 下一個節點是哪個節點? 如果當前節點有四個子樹,為什么我們只想檢查其中一個? 如果沒有子樹怎么辦?

      檢查您要尋找的節點是否在根目錄中。 如果返回true,否則檢查它是否在任何子樹中。 如果返回true,否則檢查是否有任何子子樹。 如果存在,則檢查那些子子樹中的節點,否則返回false。

      1. 您說的是應該以廣度優先的順序檢查節點。 那是檢查他們的最佳選擇嗎? 您還可以檢查其他哪些訂單? 他們會更容易嗎?
  2. y是什么意思? 它是什么類型?

    y是包含類型b元素的列表。

    1. 你可以說得更詳細點嗎? (我是在treeContains的特定上下文中treeContains ,而不是在treeContains的更一般的上下文中treeFold 。) b是什么?

      y是一個包含類型為Tree a元素的列表(因此bTree a

      你確定嗎?

      1. 有人告訴您treeContains :: Eq a => a -> Tree a -> Bool treeContains a treeContains :: Eq a => a -> Tree a -> Bool ,那么treeContains a什么類型?

      2. 您已經確定treeContains a = treeFold (\\xy -> if a == x then True else ...) 鑒於此以及您對上一個問題的回答, treeFold (\\xy -> if a == x then True else ...)是什么類型treeFold (\\xy -> if a == x then True else ...)

      3. 給定您對上一個問題的答案,並給定treeFold :: (a -> [b] -> b) -> Tree a -> b(\\xy -> if a == x then True else ...)的類型是什么? (\\xy -> if a == x then True else ...)

      4. 給定您對上一個問題的答案, y的類型是什么?

    2. 這個值是什么意思? 它能告訴您有關樹中其他節點的信息嗎? 整個子樹? 哪個? 它告訴你關於他們的什么? 他們的大小? 他們的身高? 他們是否平衡? 關於他們的內容?

  3. 您能從y計算...嗎? 您需要什么功能? 它/它們的類型是什么?


重新treeBalanced

  1. 如果要編寫函數treeHeight :: Tree a -> Int ,您將如何做? 您會使用treeFold嗎?

  2. 如果您想編寫一個函數treeHeightAndBalanced :: Tree a -> (Int, Bool) ,您將如何做?

  3. 如果您已經有了treeHeightAndBalanced :: Tree a -> (Int, Bool) ,您怎么能寫出treeBalanced :: Tree a -> Bool

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM