List 如何在OCaml中查找列表中数字的对立面?
我想在列表中找到一个数字的对立面。我想遍历列表中的每个元素,并检查列表中是否有与此元素相对的元素 这就是我到目前为止所做的:List 如何在OCaml中查找列表中数字的对立面?,list,ocaml,List,Ocaml,我想在列表中找到一个数字的对立面。我想遍历列表中的每个元素,并检查列表中是否有与此元素相对的元素 这就是我到目前为止所做的: 让rec findoposite l= 匹配 |[]->false |f::x::ll->if(List.mem(-x)f=false&&List.mem(-x)ll=false)则true,否则findoposite ll;; 我天真地认为“f”代表了列表中以前的所有元素 我还探讨了这个解决方案:将列表展平,使其更简单。但现在我有点迷路了 这里需要迭代列表中的每个元素
让rec findoposite l=
匹配
|[]->false
|f::x::ll->if(List.mem(-x)f=false&&List.mem(-x)ll=false)则true,否则findoposite ll;;
我天真地认为“f”代表了列表中以前的所有元素
我还探讨了这个解决方案:将列表展平,使其更简单。但现在我有点迷路了
这里需要迭代列表中的每个元素,检查它的对立面是否在那里,如果是->true,否则继续,直到结束
谢谢。如果这不是作业,我可以给出一个可能的解决方案。如果我理解正确,你想知道一组整数在求反时是否闭合。您可以计算集合,然后求反集合,然后查看这两个集合是否相等
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
写一篇关于你的高层计划的描述可能会很好。将名单扁平化是一种策略,但并非真正的高层次计划。例如,您可能遍历列表列表并计算一个集合,或者可能计算两个集合。然后,您可以通过对集合属性的简单测试来回答这个问题。如果你决定集合中应该包含什么,那将是一个高层次的计划。@JeffreyScofield嗯,这个函数将用于命题逻辑。这一个有一个明确的目标,就是找到一个纯文本,因此我试图在列表中找到它的对立面。这太高了!:-)我指的是从列表中得到你想要的答案的计划。