Как найти противоположность числа в списке в OCaml? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь найти противоположность числа в списке списка. Я хочу перебрать каждый элемент списка списка и проверить, находится ли противоположность этого элемента в списке списка.

Это то, что я сделал до сих пор:

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, иначе продолжить, пока мы не достигнем конца.

Спасибо.

1 Ответ

1 голос
/ 22 октября 2019

Если это не задание, я могу дать одно возможное решение. Если я правильно понимаю, вы хотите знать, если набор целых чисел закрыт при отрицании. Вы можете вычислить набор, затем отменить набор, а затем посмотреть, равны ли два набора.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...