Algorithm 相互检查列表中的每个值
我正在使用OCaml,我有一个列表,需要在其中相互检查列表中的所有元素。该列表是一个单位列表,可以是基本单位,也可以是衍生单位。基本单位是m、s、g,派生单位是使用m、s、g的任何单位,如kg、min、ft、lb等 因此,示例列表是[lb;ft;m]。此列表将无效,因为ft和m共享相同的基本单位:m。更清楚地说,[lb;kg;s]将无效,因为lb和kg共享相同的基本单位:m。但是[ft;s;m]是完全有效的。这些基本单位转换保存在散列中以供查找Algorithm 相互检查列表中的每个值,algorithm,list,ocaml,ml,Algorithm,List,Ocaml,Ml,我正在使用OCaml,我有一个列表,需要在其中相互检查列表中的所有元素。该列表是一个单位列表,可以是基本单位,也可以是衍生单位。基本单位是m、s、g,派生单位是使用m、s、g的任何单位,如kg、min、ft、lb等 因此,示例列表是[lb;ft;m]。此列表将无效,因为ft和m共享相同的基本单位:m。更清楚地说,[lb;kg;s]将无效,因为lb和kg共享相同的基本单位:m。但是[ft;s;m]是完全有效的。这些基本单位转换保存在散列中以供查找 我的问题是我怎样才能互相检查所有的装置。我试过用褶
我的问题是我怎样才能互相检查所有的装置。我试过用褶皱,但它让我的头受伤了。有人能帮我吗?具有二次复杂性的简单解决方案:
(* [check_pair] should return [false] if check fails *)
let rec check_each_pair check_pair = function
| [] -> true
| hd1 :: rest ->
let rec check_rest = function
| [] -> true
| hd2 :: rest -> check_pair hd1 hd2 && check_rest rest
in
check_rest rest && check_each_pair check_pair rest
请注意,内部检查\u rest
仅检查列表中每个元素上的谓词。这是列表。对于所有的
let rec check_each_pair check_pair = function
| [] -> true
| hd1 :: rest ->
List.for_all (check_pair hd1) rest && check_each_pair check_pair rest
您可能会对combinator发疯,还可以将check\u each\u pair
作为对递归组合器的调用来实现,但这不是直接的(您需要以某种方式累积rest
,因此需要折叠,但您希望快捷方式尽早失败)我看不出有什么好处。一个简单的解决方案是首先从列表中创建一个所有对的列表(通过使用列表本身),然后检查对列表上的条件:
let cartesian xs ys =
List.concat (List.map (fun x -> List.map (fun y -> (x, y)) ys) xs)
let haveDifferentBases(x, x') =
(* check whether they have different base units *)
let check_all_pairs xs =
List.for_all haveDifferentBases (cartesian xs xs)
你能澄清一下“磅”和“千克”是如何共用相同的基本单位“米”的吗?假设我读的没错,“m”、“s”和“g”分别代表“米”、“秒”和“克”。还有,这是家庭作业吗?如果是这样的话,将你的问题标记为这样是很好的。因此,据我所知,你想检查任何两个连续元素是否满足某些条件(共享基本单位)?我的Haskell本能地向我建议一些列表。(concat地图)-ping!:这是inits
和tails
方便的地方:check\u each\u pair prd=all(\(h:t)->all(prd h)t)。尾巴
或类似的东西。