我需要一些帮助来弄清楚如何在Haskell中创建leftSpine
函数。
基本上,它应该采取所有最左边的叶子并将它们放入列表中,但每当我运行我的代码时,我得到一个空列表。任何帮助将不胜感激。
这是我的代码。
data Tree x = Leaf | Node (Tree x) x (Tree x)
deriving Show
leftSpine :: Tree x -> [x]
leftSpine Leaf = []
leftSpine (Node lt x rt) = (leftSpine lt)
这是我的代码来测试它。
leftSpine (Node (Node (Node Leaf 1 Leaf) 2 (Node Leaf 3 Leaf))
4
(Node (Node Leaf 5 Leaf) 6 (Node Leaf 7 Leaf)))
它应该等于[4,2,1]
,但它只是[]
。
答案 0 :(得分:6)
leftSpine :: Tree x -> [x]
leftSpine Leaf = []
leftSpine (Node lt x rt) = x:leftSpine lt
你实际上没有把任何东西放到列表中。区别在于x:leftSpine lt
而不是leftSpine lt
。
答案 1 :(得分:2)
您的代码明确表示结果始终是空列表。
第一种情况说叶子的左脊柱是空列表。好到目前为止。
第二种情况说节点的左侧脊柱恰好是节点左侧子节点的左侧脊柱。
因此,如果我们想要找到树的左侧脊柱,我们将继续追踪我们到达的节点的左侧子节点,知道答案完全等于下一个左侧子节点的左侧脊柱。要么我们最终找到一个叶子,我们的结果是空列表,或者树是无限的,我们永远不会返回结果。您的代码中没有任何内容可以返回任何其他内容。
编写这种递归函数的关键是找出基本情况(Leaf
,这里)的答案,然后是非基本情况(Node
,在这里你需要弄清楚如何将子解决方案与本地信息结合起来,以生成完整的解决方案。
在这种情况下,Leaf
的左侧脊柱很容易,因为根本没有数据。那么,您如何将Node lt x rt
与leftSpine lt
的信息结合起来以获得整棵树的左侧脊柱?