我试图编写一个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的新手,并且真的不知道从哪里开始解决这个问题,我真的很感激一些指导。谢谢
答案 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)
函数的类型,所以你已经中途了!
为了定义这个函数,假设我们有一个自定义的数据类型,我们可以放心使用模式匹配。
模式匹配,简单来说,是一种通过左侧描述的方程来定义函数的方法,在我们的例子中,我们的数据类型的一个元素(maxInt
或Leaf
)并在右侧,结果值。我建议您在此处详细了解模式匹配: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)
中的最大值,n
和leftTree
的最大值。< / p>
你会被鼓励写下第二个等式吗?我强烈建议您先阅读上面刚刚链接的书中的章节。另外,您可能需要阅读recursion in Haskell。