Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 相互检查列表中的每个值_Algorithm_List_Ocaml_Ml - Fatal编程技术网

Algorithm 相互检查列表中的每个值

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]是完全有效的。这些基本单位转换保存在散列中以供查找 我的问题是我怎样才能互相检查所有的装置。我试过用褶

我正在使用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)。尾巴
或类似的东西。