Haskell 从树中获取节点
给定 这段代码主要收集大于N的所有节点Haskell 从树中获取节点,haskell,recursion,functional-programming,Haskell,Recursion,Functional Programming,给定 这段代码主要收集大于N的所有节点 我知道在基本情况下,我们正在查看一个特定的叶,检查它是否大于n,如果大于n,我们将其添加到列表中,否则我们不会。然而,我完全不理解解决方案的另一部分。有人能帮我把它分解一下,或者尽量简化一下吗?我非常感谢。解决方案的另一部分处理使用n调用collectnode和具有左树、值和右树的节点的情况。我们需要在左子树和右子树上递归执行collectnode,并且我们还需要包含此节点的值,当且仅当它大于n。有两种情况需要考虑: |n1>n=(collectnode
我知道在基本情况下,我们正在查看一个特定的叶,检查它是否大于n,如果大于n,我们将其添加到列表中,否则我们不会。然而,我完全不理解解决方案的另一部分。有人能帮我把它分解一下,或者尽量简化一下吗?我非常感谢。解决方案的另一部分处理使用
n
调用collectnode
和具有左树、值和右树的节点的情况。我们需要在左子树和右子树上递归执行collectnode
,并且我们还需要包含此节点的值,当且仅当它大于n
。有两种情况需要考虑:
|n1>n=(collectnode n tr1)+[n1]+(collectnode n tr2)
在本例中,n1>n
因此我们希望包括递归收集左子树产生的所有结果、当前节点的值以及递归收集右子树产生的所有结果
|否则=(collectnode n tr1)++(collectnode n tr2)
在这种情况下,不应包括来自当前节点的值,因此我们只收集来自左子树和右子树的值。结果是两者的串联
自然,它不会永远递归,因为在收集子树的某个时候,我们会深入到由基本大小写处理的叶节点。似乎有输入错误collectnode n(Node t1 n t2)
应为collectnode n(Node t1 n1 t2)
,但实际上,如果在这种情况下也使用x
,而不是n1
,我会发现它会更清楚。而且,似乎是collectnode
类型中的打字错误。看看它的用法,它一定是collectnode::Int->Tree->[Int]
。标识符没有正确使用<代码>收集节点n(节点tr1 n1 tr2)
data Tree = Leaf Int | Node Tree Int Tree
collectnode :: Int -> [Tree] -> [Int]
collectnode n (Leaf x)
|x > n = [x]
|otherwise = []
collectnode n (Node t1 n t2)
|n1 > n = (collectnode n tr1) ++ [n1] ++ (collectnode n tr2)
|otherwise = (collectnode n tr1) ++ (collectnode n tr2)