[英]Haskell - generating all paths between nodes
我需要構建一個函數,它返回某些節點之間的所有路徑。
connect :: Int -> Int-> [[(Int,Int)]]
Data.Graph庫為我提供了有用的函數'buildG',它為我構建了圖形。 如果我打電話
let g = buildG (1,5) [(1,2),(2,3),(3,4),(4,5),(2,5)]
,
我將得到一個數組,其中每個節點都映射到他的鄰居。 一個例子:
g!1 = [2]
g!2 = [3,5]
..
g!5 = []
我試圖使用列表推導來做到這一點,但我在haskell中並不是很好,而且我輸入的錯誤是我無法修復的。
connect x y g
| x == y = []
| otherwise = [(x,z) | z <- (g!x), connect z y g]
關於周期,我現在不需要擔心。 這是我想要的:
connect 1 5 g = [[(1,2),(2,3),(3,4),(4,5)],[(1,2),(2,5)]]
遞歸思考。 從s
到e
路徑由s
一個邊(s,t)
和從t
到e
的路徑組成,除非s == e
,在這種情況下路徑應為空。 所以第一次嘗試是
connect x y g
| x == y = [[]]
| otherwise = [(x,t):path | t <- g!x, path <- connect t y g]
從節點到自身的所有合格路徑的列表是具有單個元素[]
的列表,在其他情況下,我們通過上面的邏輯獲得所有符合條件的路徑的列表,選擇第一個邊緣並從其末尾找到路徑。
問題是循環會導致它掛起。 為避免這種情況,您必須記住您已訪問過的節點,而不是從中探索的路徑:
connect x y g = helper x y g [x]
where
helper a b g visited
| a == b = [[]]
| otherwise = [(a,c):path | c <- g!a, c `notElem` visited, path <- helper c b g (c:visited)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.