簡體   English   中英

在Haskell中生成n元二叉樹

[英]Generate n-ary binary tree in haskell

我嘗試從此結構創建隨機樹:

data Tree a = Leaf a
            | Funktion (Tree a) (Tree a)
            | Lambda (Tree a)
            deriving (Show)

我遇到的問題是,我什至不知道如何生成深度為(例如)2的樹,該樹僅以“ Lambda”作為節點。 如果有人可以幫助我生成此簡單樹(深度2),則可以隨機生成它們。 如果我實現這樣的功能:

build (Tree a) 0 = Leaf "A"
build (Tree a) n = build (Lambda a) (n-1)

由於函數構建本身希望將Tree作為輸入,因此它將無法正常工作。 實際上,我需要具有Lambda或Funktion節點的樹,但首先,我需要了解如何生成此結構的簡單版本。

聽起來你想要類似的東西

build :: Natural       -- ^ Number, n, of Lambda nodes
      -> a             -- ^ Value, v, to store in the Leaf
      -> Tree a        -- ^ Lambda^n (Leaf v)
build 0 a = Leaf a
build n a = Lambda (build (n - 1) a)

這樣build 4 "A"將產生

Lambda (Lambda (Lambda (Lambda (Leaf "A"))))

不幸的是,您剩下的問題(關於生成隨機樹)的確需要更多的上下文來回答。

你靠近-你build此刻功能將始終返回Leaf ,作為遞歸的基本情況並沒有它的參數什么。 您實際上不需要參數:

build :: Integer -> Tree String
build 0 = Leaf "A"
build n = Lambda $ build (n-1)

這將產生您的build功能似乎想要的功能,即給定深度n的簡單“樹”,由一個Leaf節點和Lambda節點組成。 例如:

λ> build 2
Lambda (Lambda (Leaf "A"))

要獲取隨機生成的樹,您需要查看System.Random模塊。

例如,在前一個基礎上,給定上下限之間的高度隨機的樹:

buildRandom :: (Integer, Integer) -> IO (Tree String)
buildRandom bounds = randomRIO bounds >>= return . build

可以對其進行擴展和修改,以產生所需的行為(完全隨機生成的樹),但需要了解monad等,這可能需要一些額外的閱讀材料。

暫無
暫無

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

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