Haskell二叉树最大int?

时间:2018-01-20 23:31:58

标签: haskell functional-programming binary-tree

我试图编写一个haskell函数,它将在整数二叉树中返回max int。我的二叉树定义如下:

data Tree = Node Int Tree Tree | Leaf Int
deriving (Eq,Show)

我理解这个宣言的方式是说,对于“树”来说。数据类型,它可以是单个叶子int,也可以是包含两个以上树的子树。 所以我的maxInt函数看起来像这样(我认为)

maxInt :: Tree -> Int      --maxInt function receives Tree, returns int
maxInt --something to detect if the Tree received is empty 
--if only one node, return that int
--look through all nodes, find largest

所以当我的功能给出类似的东西时 maxInt(节点5(叶7)(叶2)),返回的maxInt的正确值为7.

我是haskell的新手,并且真的不知道从哪里开始解决这个问题,我真的很感激一些指导。谢谢

2 个答案:

答案 0 :(得分:4)

让我为你开始吧:

[^;\r\n]*;

您可能会发现使用标准函数maxInt :: Tree -> Int maxInt (Leaf x) = ? maxInt (Node x l r) = ? 很有帮助,该函数接受两个参数并返回其最大值:

max

答案 1 :(得分:2)

首先,我们有这个数据类型:

data Tree = Node Int Tree Tree | Leaf Int
  deriving (Eq,Show)

这意味着,对于constructors类型的内容我们有两个Tree:要么Leaf有一个Int值,要么我们有一个{{1}这允许我们以递归的方式表示更大的树。

所以,例如我们可以拥有这些树:

Node

更复杂的:

Leaf 0

回想一下,这个树表示在叶子和节点中都有信息,所以对于我们的功能,我们需要考虑到这一点。

你猜对了Node 3 (Leaf 0) (Leaf 4) 函数的类型,所以你已经中途了!

为了定义这个函数,假设我们有一个自定义的数据类型,我们可以放心使用模式匹配。

模式匹配,简单来说,是一种通过左侧描述的方程来定义函数的方法,在我们的例子中,我们的数据类型的一个元素(maxIntLeaf )并在右侧,结果值。我建议您在此处详细了解模式匹配:pattern matching in Haskell

因此,我们按照你的类型开始我们的函数,正如你猜测的那样:

Node

正如我们之前所见,我们将使用模式匹配。第一个等式是什么,也就是我们函数的第一个模式匹配情况?我们给出数据类型的最简单的树是maxInt :: Tree -> Int 。所以我们从:

开始
Leaf value

为什么会maxInt (Leaf n) = n ?因为我们在树中没有除n之外的任何其他值,因此它是最大值。

在更复杂的情况下会发生什么?

n

嗯......我们可以认为树maxInt (Node n leftTree rightTree) = ... 的最大值是(Node n leftTree rightTree)中的最大值,nleftTree的最大值。< / p>

你会被鼓励写下第二个等式吗?我强烈建议您先阅读上面刚刚链接的书中的章节。另外,您可能需要阅读recursion in Haskell