Ik was voor de grap even wat met Haskell aan het spelen voor het vak Algoritmen & Datastructuren. Bij het hoofdstuk over grafen dacht ik even een stukje te schrijven dat kijkt of er een pad bestaat tussen twee vertices. Hiervoor heb ik het volgende bedacht:
Dit lijkt goed te werken, maar in graaf1 geeft
het antwoord False. Dit moet echter True zijn.
Ook in graaf2 gaat er iets niet goed. Volgens het programmaatje is er geen pad tussen 6 en 3, dit is er wel.
Kan iemand ontdekken welke denkfout ik maak?
Haskell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| type Graaf = (Vertices, Edges) type Vertices = [Vertex] type Vertex = Int type Edges = [Edge] type Edge = (Vertex, Vertex) graaf1 :: Graaf graaf1 = ([1,2,3,4,5],[(1,2),(2,4),(2,3),(3,1),(3,5),(5,4)]) graaf2 :: Graaf graaf2 = ([1,2,3,4,5,6],[(1,2),(1,4),(2,3),(4,5),(5,6),(5,2),(6,5)]) isConnected :: Graaf -> Vertices -> Vertices -> Vertex -> Bool -- g = de graaf -- l = een lijst van reeds bezochte vertices -- (a:k) = een lijst van te bekijken vertices -- v = de vertex waar we naartoe willen isConnected g l [] v = False isConnected (vs, es) l (a:k) v | a == v = True | (visited l a) = False | otherwise = (isConnected (vs,es) (a:l) (adjecentVertices es a) v) || (isConnected (vs,es) (a:l) k v) adjecentVertices :: Edges -> Vertex -> Vertices adjecentVertices [] v = [] adjecentVertices ((o,d):k) v | o == v = (d:(adjecentVertices k v)) | otherwise = (adjecentVertices k v) visited :: Vertices -> Vertex -> Bool visited [] v = False visited (a:k) v | a == v = True | otherwise = (visited k v) |
Dit lijkt goed te werken, maar in graaf1 geeft
code:
1
| isConnected graaf1 [] [1] 5 |
het antwoord False. Dit moet echter True zijn.
Ook in graaf2 gaat er iets niet goed. Volgens het programmaatje is er geen pad tussen 6 en 3, dit is er wel.
Kan iemand ontdekken welke denkfout ik maak?