我试图走树并将每条路径变成一个列表。这是我的结构。我称它为Unigraph
,因为它是一个单向图。如果我使用不正确的术语,请道歉。
data Unigraph a = Node a [Unigraph a] deriving (Show)
基本上,我试图描述这样的结构:
1
/ | \
2 3 4
/ \ \
3 4 4
我有以下功能:
comboGraph :: [a] -> Int -> [Unigraph a]
comboGraph _ 0 = []
comboGraph [] _ = []
comboGraph (x:xs) n =
buildEdge x xs : (comboGraph xs n)
where buildEdge h t = Node h (comboGraph t (n-1))
对于给定的列表和整数n
,我可以创建Unigraph
个n
深度。
因此,可以通过运行
创建上述图表let ug = head $ comboGraph [1..4] 3
这是我试图解决的问题。我想将给定的Unigraph
转换为路径列表,即[[1,2,3], [1,2,4], [1,3,4], [1,4]]
。
这是我到目前为止所拥有的:
getAllPaths :: Unigraph a -> [[a]]
getAllPaths (Node _ []) = []
getAllPaths (Node a (x:xs)) =
getAllPaths x ++ getAllPaths' xs
where getAllPaths' (y:ys) = getAllPaths y ++ getAllPaths' ys
getAllPaths' [] = []
但是这个函数不考虑任何地方的节点值!我被困在这里了。我该怎么做?
答案 0 :(得分:0)
在基本情况下,您需要返回节点值
在递归的情况下 - 将节点值预先添加到每个子路径
getAllPaths :: Unigraph a -> [[a]]
getAllPaths (Node a []) = [[a]]
getAllPaths (Node a children) = map (a:) (concatMap getAllPaths children)