gpt4 book ai didi

haskell - 从边列表构建一棵树 : missing Leaf nodes

转载 作者:行者123 更新时间:2023-12-04 05:27:06 26 4
gpt4 key购买 nike

我写了下面的代码来构造一个给定顶点的树,给出顶点之间的连接列表。

type Connection = (Int,Int)
data Tree = Leaf Int | Node Int [Tree] deriving (Eq,Read,Show)

makeTree :: Int -> [Connection] -> Tree
makeTree x [] = Leaf x
makeTree indx connections = Node indx otherTrees where
otherTrees = [makeTree i cx | i <- directConnections, let cx = removeConnectionsTo indx connections]
directConnections = map (\(x,y) -> if (x == indx) then y else x) $ filter (\(x,y) -> x == indx || y == indx) connections

removeConnectionsTo :: Int -> [Connection] -> [Connection]
removeConnectionsTo indx = filter (\(x,y) -> x /= indx && y /= indx)

出于某种原因,下面的输入给了我惊人的不同结果:
makeTree 1 [(1,2),(1,3)]给我 Node 1 [Leaf 2,Leaf 3] makeTree 1 [(1,2),(1,5),(2,3),(2,4),(5,6),(5,7)]给我 Node 1 [Node 2 [Node 3 [],Node 4 []],Node 5 [Node 6 [],Node 7 []]]
我在 OS X 10.8.2 上运行 GHCi,版本 7.4.1。

我不明白为什么我在第一个例子中得到 Leaf 两次(正确),但在第二个例子中得到了空子树列表的节点(不正确)。

最佳答案

一个快速的解决方法是检查是否 otherTrees在决定是否建一个之前是空的LeafNode ,例如

makeTree indx connections
| null otherTrees = Leaf indx
| otherwise = Node indx otherTrees
where ...

要了解这里发生了什么,让我们添加一些工具:
import Debug.Trace

makeTree :: Int -> [Connection] -> Tree
makeTree ix cs | traceShow (ix, cs) False = undefined
makeTree x [] = ... -- leave rest of the function as before

现在将其加载到 GHCi 中,让我们看看递归调用是什么:
> import Control.DeepSeq
> (show $ makeTree 1 [(1,2),(1,5),(2,3),(2,4),(5,6),(5,7)]) `deepseq` ()
(1,[(1,2),(1,5),(2,3),(2,4),(5,6),(5,7)])
(2,[(2,3),(2,4),(5,6),(5,7)])
(3,[(5,6),(5,7)])
(4,[(5,6),(5,7)])
(5,[(2,3),(2,4),(5,6),(5,7)])
(6,[(2,3),(2,4)])
(7,[(2,3),(2,4)])
()

如您所见,第二个参数中的列表不为空,这就是它与函数的第一种情况不匹配的原因,因此您需要像我的示例一样添加一些额外的检查,或者确保您过滤掉其余的连接。

关于haskell - 从边列表构建一棵树 : missing Leaf nodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com