我正在尝试在列表列表中查找数字的反义词。我想遍历列表列表的每个元素,并检查列表列表中是否与此元素相反。
这是我到目前为止所做的:
let rec findOpposite l =
match l with
| [] -> false
| f::x::ll -> if (List.mem (-x) f = false && List.mem (-x) ll = false) then true else findOpposite ll;;
我天真的认为'f'代表列表中的所有先前元素...
我还探讨了此解决方案:整理列表,使其更加简单。但是现在我有点迷路了。
这里期望的是遍历列表的每个元素,检查列表中是否有相反的元素,如果是-> true,否则继续直到结束。
谢谢。
答案 0 :(得分:1)
如果这不是一项任务,我可以给出一个可能的解决方案。如果我理解正确,您想知道是否在求反时关闭了一组整数。您可以计算出集合,然后取反集合,然后查看两个集合是否相等。
module ISet =
Set.Make(struct type t = int let compare = compare end)
let get_set ll =
List.fold_left
(List.fold_left (fun is i -> ISet.add i is))
ISet.empty
ll
let negate_set is = ISet.map (fun i -> -i) is
let closed_set is = ISet.equal is (negate_set is)
您可以这样尝试:
# closed_set (get_set [[1;2]; [-2;-2]; [3;-3;-1]]);;
- : bool = true
# closed_set (get_set [[1;2]; [-2;-2]; [3;-3]]);;
- : bool = false