Я новичок в Clojure и довольно новичок в функциональном программировании в целом. Я пытаюсь создать генератор анаграмм, который создает все возможные перестановки строки. Я думал, что я обобщу его и придумаю все возможные перестановки в списке.Где находится этот список из Clojure?
Моя попытка:
(defn pairs [items]
(list (list (first items) (last items))
(list (last items) (first items))))
(defn prepend-to-list-or-item [item coll]
(if (coll? coll)
(map #(cons item %) coll)
(list item coll)))
(defn remove-one [coll item]
(let [[n m]
(split-with (partial not= item) coll)]
(concat n (rest m))))
(defn get-combinations [items]
(cond (= 0 (count items)) nil
(= 1 (count items)) items
(= 2 (count items)) (pairs items)
:else
(map #(prepend-to-list-or-item % (get-combinations (remove-one items %))) items)))
Проблема у меня в том, что я получаю списки, которые вложены слишком глубоко. Выход я получаю:
clojure-test.combinations> (clojure.pprint/pprint (get-combinations '(\a \b \c)))
(((\a \b \c) (\a \c \b))
((\b \a \c) (\b \c \a))
((\c \a \b) (\c \b \a)))
nil
Мой желаемый результат:
((\a \b \c) (\a \c \b) (\b \a \c) (\b \c \a) (\c \a \b) (\c \b \a))
С большим количеством элементов списка, проблема становится все хуже.
Итак, два вопроса:
- Где находится этот дополнительный уровень вложенности приходит? Я пробовал разные версии cons, concat, list и т. Д. Безрезультатно.
- Что я могу сделать, чтобы сделать это «Clojury?»?
'Что я могу сделать, чтобы сделать это более' «Clojury?» - это часто называют «более идиоматических» - Как и в «Как я могу сделать это Код clojure более идиоматический? " – birdspider