Это правильная функция с использованием рекурсии:
(defn make-control-data [it alphabet]
{:pre [(integer? it) (not (neg? it))]}
(if (zero? it) ""
(str (reduce str (shuffle alphabet)) (make-control-data (dec it) alphabet))))
(make-control-data 2 ["a" "b" "c"])
возвращает "bcacab"
и
(count (make-control-data 2 ["a" "b" "c"]))
возвращает 6.
Также работают следующие работы:
(defn make-control-data [it alphabet]
(if (= it 1) (reduce str (shuffle alphabet))
(str (reduce str (shuffle alphabet)) (make-control-data (dec it) alphabet))))
с одним шагом рекурсии меньше, чем в предыдущей функции. Хотя предварительные условия и рекурсия не нужны, я был бы признателен за другие, более эффективные способы рекурсивной реализации этой функции.