【发布时间】:2014-12-08 23:37:48
【问题描述】:
一个函数,journey,它获取旅程开始的城市名称和结束城市的名称,并返回进行最少更改次数的旅程。例如,仅考虑曼谷航空公司,
journey "Singapore" "Singapore"
and returns[ ]
journey "Singapore" "Bangkok"
and returns [ ("Singapore", "Bangkok Airways", "Bangkok") ]
journey "Singapore" "New Delhi"
and returns [ ("Singapore", "Bangkok Airways", "New Delhi") ]
在更大的网络中,
journey "Singapore" "France"
====> [ ("Singapore", "Bangkok Airways", "Greece") ,("Greece", "Lufthansa", "France")]
这就是我目前所拥有的
city :: String -> (String,String,String)
city "Singapore" =("Singapore","Bangkok Airways", "Bangkok")
city "Bangkok" =("Bangkok","Bangkok Airways", "Bago")
city "Bago" = ("Bago", "Bangkok Airways", "Yangon")
city "Yangon" =("Yangon", "Bangkok Airways", "New Delhi")
city "New Delhi" = ("New Delhi", "Bangkok Airways", "Kiev")
这将返回旅程,但是,这并不意味着它是最短的。 还有城市的定义它需要更多的修饰,因为我认为它不是有效的。
【问题讨论】:
-
如果您将城市和航空公司分为两种数据类型:
data Place = France | Greece | Singapore | Bangkok | Bago | Yangon | NewDelhi deriving (Eq, Show)和data Airline = Lufthansa | BangkokAirways deriving (Eq, Show,编译器肯定会更高效、更轻松地为您提供帮助。然后你可以定义city :: Place -> (Place, Airline, Place),当你错过一个模式匹配时,编译器会警告你(用-Wall)。 -
你要的是最短路径算法,即Dijkstra算法。有一些图形库可以做到这一点,但如果你想自己编写它,你可能应该从实现图形数据类型开始。
标签: string list haskell tuples