List Data.Graph中的路径函数在Haskell中是如何工作的?
我已经阅读了路径函数中的文档(对于有向图)。搜索引擎里没有太多东西 我所发现的一切基本上归结为 它真正说明的是路径函数的作用(我已经知道),以及输出的示例。我想弄清楚的是,路径函数是如何工作的,或者它是如何手动实现的。到目前为止,我已经走到了这一步,但现在我陷入了困境(或者可能完全走错了路,我不能确定): 但是我很难看到如何正确地得到递归。我想我只是盯着它看了太久,看不清整个问题了。逻辑应该是这样的:List Data.Graph中的路径函数在Haskell中是如何工作的?,list,haskell,recursion,graph,functional-programming,List,Haskell,Recursion,Graph,Functional Programming,我已经阅读了路径函数中的文档(对于有向图)。搜索引擎里没有太多东西 我所发现的一切基本上归结为 它真正说明的是路径函数的作用(我已经知道),以及输出的示例。我想弄清楚的是,路径函数是如何工作的,或者它是如何手动实现的。到目前为止,我已经走到了这一步,但现在我陷入了困境(或者可能完全走错了路,我不能确定): 但是我很难看到如何正确地得到递归。我想我只是盯着它看了太久,看不清整个问题了。逻辑应该是这样的: 它从x=n的元组中获取y值 它查找上面Y值列表中x所在的所有元组 如果没有Y值=m,则在n=
- 它从x=n的元组中获取y值
- 它查找上面Y值列表中x所在的所有元组
- 如果没有Y值=m,则在n=(每个X值)和m=m的新元组列表上执行路径函数
- 如果在Y值中找到m,则返回true
谢谢 感谢评论员提供的资源,帮助我编写了以下解决方案:
member _ [] = False
member n (x:xs)
| x == n = True
| otherwise = member n xs
unique [] = []
unique (x:xs)
| member x xs == True = unique xs
| otherwise = x:(unique xs)
findAllEndsForX :: [(Int , Int)] -> Int -> [Int]
findAllEndsForX [] _ = []
findAllEndsForX ((a,b):xs) y
| xs == [] = a:[b]
| a == y = a:(findAllEndsForX xs b)
| otherwise = (findAllEndsForX xs b)
accessible :: [(Int , Int)] -> Int -> [Int]
accessible [] _ = []
accessible xs n = unique (findAllEndsForX xs n)
path' :: [(Int , Int)] -> Int -> Int -> Bool
path' [] _ _ = False
path' xs v w = member w (accessible xs v)
我的最终目标是模仿路径特性的功能,而不一定是实现。我想在不使用任何预定义函数的情况下完成这项工作。您熟悉这个概念吗?因为这就是
path
所做的(特别是深度优先搜索)。你看了吗?@李耀霞我确实理解这个概念,这是我没有正确实现的yet@Bergi酷,我在找类似的东西,但我想我错过了it@Bulbasaur如果您单击文档中的“源”链接,则可以使用它
member _ [] = False
member n (x:xs)
| x == n = True
| otherwise = member n xs
unique [] = []
unique (x:xs)
| member x xs == True = unique xs
| otherwise = x:(unique xs)
findAllEndsForX :: [(Int , Int)] -> Int -> [Int]
findAllEndsForX [] _ = []
findAllEndsForX ((a,b):xs) y
| xs == [] = a:[b]
| a == y = a:(findAllEndsForX xs b)
| otherwise = (findAllEndsForX xs b)
accessible :: [(Int , Int)] -> Int -> [Int]
accessible [] _ = []
accessible xs n = unique (findAllEndsForX xs n)
path' :: [(Int , Int)] -> Int -> Int -> Bool
path' [] _ _ = False
path' xs v w = member w (accessible xs v)