在haskell中生成n-ary二叉树

时间:2017-10-03 21:19:53

标签: haskell tree binary-tree

我尝试从这个结构中创建随机树:

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)

它不起作用,因为函数构建本身期望树作为输入。实际上我需要具有Lambda或Funktion节点的树,但首先我需要了解如何生成这个结构的简单版本。

2 个答案:

答案 0 :(得分:2)

听起来你想要像

这样的东西
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"))))

不幸的是,你的其余问题(关于生成随机树)确实需要更多的背景来回答。

答案 1 :(得分:0)

你已经关闭了 - 你的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等,这可能需要一些额外的阅读。