【问题标题】:Generate n-ary binary tree in haskell在haskell中生成n元二叉树
【发布时间】:2017-10-03 21:19:53
【问题描述】:

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

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 节点的树,但首先我需要了解如何生成此结构的简单版本。

【问题讨论】:

  • 不,它不需要树作为输入,因为Tree 不是这里的构造函数...
  • 嗯...那么更好的输入是什么?
  • 你说的“随机”是什么意思? build 在树生成中扮演什么角色?你希望它有什么类型?您似乎缺少一些基础知识,例如类型构造函数和数据构造函数之间的区别。也许您应该退后一步,阅读更多介绍性材料?
  • 没有“n-ary 二叉树”这样的东西。分支因子为 2 的树是二叉树;分支因子为 n 的树是 n 叉树。
  • 很抱歉描述有误。我的意思不是 n 叉树。我的代码的结果应该生成一个随机树,给定最大深度。 build 是尝试生成只有 Lambda 节点的树。因为我想了解如何生成树。我知道如何在我的结构中实现树。例如:tree = Funktion (Leaf "A") (Lambda (Leaf "A"))

标签: haskell tree binary-tree


【解决方案1】:

听起来你想要类似的东西

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"))))

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

【讨论】:

  • 谢谢,这正是我想要的。随机树的问题是我想生成树。随机决定放置 Lambda(一元节点)还是 Funktion(二元节点)
  • @P.Barthel,在 Haskell 中,如果你想制作随机的东西,你需要一些上下文。 为什么你要制作随机树?你打算怎么处理他们?根据为什么如何的答案可能完全不同。
  • 有些东西要看quickchecktf-randomrandom-fu,但这完全取决于你在做什么。
  • 感谢您的回答。我想要创建的实际东西是称为新鲜度约束的东西。这是名义统一的话题。这些约束由 Lambda 和函数组成。我需要创建随机约束,其中原子(这就是为什么叶子中的“A”)由函数或 Lambda 界定。但这些约束不应该是完全随机的。它们应该受到最大深度的限制。
  • @P.Barthel,这里的树木意思与此无关。问题实际上更多是关于您计划如何使用您随机生成的那些。您是否正在尝试创建测试用例?您是否尝试实现randomized algorithm?等等。?您需要特定的随机分布吗?
【解决方案2】:

您已经接近了 - 您的 build 函数现在将始终返回 Leaf,因为递归的基本情况不会对其参数进行任何操作。你实际上并不需要这个论点:

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

这将产生您的build 函数似乎想要的内容,即由Leaf 节点和Lambda 节点组成的给定深度n 的简单“树”。例如:

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

要获得随机生成的树,您需要查看System.Random 模块。

例如在前一个的基础上构建一个在给定上限和下限之间随机高度的树:

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

这可以扩展和修改以产生您想要的行为(完全随机生成的树),但需要了解 monad 等知识,这可能需要额外阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多