Итак, я беру два набора и хочу перебрать их, чтобы вернуть новый набор, содержащий перекрестное произведение двух наборов.
(defn cartesian
"computes Cartesian product of A and B"
[A B]
use "set", "for")
Я очень новичок в Clojure, поэтому я не уверен, почему вообще используется «set, for». Но A и B будут множествами. Теперь я хочу перебрать каждый из них и вернуть их декартово произведение. Пример:
(cartesian #{1 2} #{3 4 5}) => #{[1 3] [1 4] [1 5] [2 3] [2 4] [2 5]}
Я не уверен в шагах, чтобы добраться туда, хотя. Я просмотрел документацию и т. д., но не могу найти то, что ищу. Другой ответ на этот вопрос касается списков и т. д. Но я должен использовать 2 набора.
То, что я смотрю на банкомат, использует doseq[e A]
и внутри этого doseq[x B]
, затем добавляет каждую векторную пару [e x]
в новый набор, а затем возвращает его. Однако это не похоже на стандартное функциональное решение. Я на правильном пути? Как добавить его в новый сет?
Отвечает ли это на ваш вопрос? Декартово произведение в clojure
Как я уже сказал, я просмотрел другие ответы, но они используют список. Как тот, который вы связали. Ответ Руле правильный.
Используйте декартово произведение из clojure.math.combinatorics. Чтобы получить точный результат, который вы хотите (набор векторов), используйте into
с датчиком map
:
(into #{} (map vec) (clojure.math.combinatorics/cartesian-product #{1 2} #{3 4 5}))
=> #{[2 3] [2 5] [1 4] [1 3] [1 5] [2 4]}
Возможно это