繁体   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