我很难习惯Haskell中的递归,无论如何有人可以向我解释我将如何解决这个问题。 我看了很多其他帖子,但我无法弄明白该怎么做。
我的类型为
data BST = MakeNode BST String BST
| Empty
我不确定如何检查树下每一条路径的组合。
答案 0 :(得分:9)
考虑大多数递归函数的技巧很简单:首先考虑基本情况,然后考虑递归情况。
基本情况通常是微不足道的 - 你什么时候知道树的高度而没有任何额外的计算?当然没有孩子的时候!所以基本情况是:
height Empty = 0
这非常简单。现在接下来的问题是:带子元素的二叉树的高度是多少?
嗯,这也很简单 - 它是1,对于当前节点,加上最高子树的高度。所以:
height MakeNode left _ right = 1 + max (height left) (height right)
(_
只表示我们不关心节点中的字符串。)
所以我们有一个非常简单的功能:
height :: BST -> Int
height Empty = 0
height (BST left _ right) = 1 + max (height left) (height right)
我希望这能澄清设计递归函数的思维过程。
答案 1 :(得分:1)
该类型的任何树都将具有无限高度,因为无法表示叶子。
如果类型定义为:
data BST = MakeNode BST String BST
| MakeLeaf
然后叶子的高度为0,节点的高度为1加上其两个子树的最大高度。