Как вернуть соответствующий номер, когда предикация истинна в clojure

Я хочу вернуть факторы числа, и эти факторы должны быть в заданном диапазоне. Нравиться:

user=> (factors (range 1 10) 12)
(1 2 3 4 6)

Я написал некоторый код, но они возвращают true или false. Мой код:

(defn factors [range num]
   (map #(= (mod num %) 0) range))

результат теста:

user=> (factors (range 1 10) 12) 
(true true true true false true false false false)

Как я могу получить числа (1 2 3 4 6) вместо true и false? Большое спасибо!


person Xiufen Xu    schedule 16.02.2016    source источник


Ответы (1)


Используйте filter:

(defn factors [candidates num]
  (filter #(zero? (mod num %)) candidates))

Пример:

(factors (range 1 10) 12)
;=> (1 2 3 4 6)
person Sam Estep    schedule 16.02.2016
comment
Попался! Большое спасибо! - person Xiufen Xu; 16.02.2016
comment
Я бы не стал использовать range в качестве имени, так как это соответствующая стандартная функция. Это также вводит в заблуждение, поскольку подойдет любая последовательность чисел — это не обязательно должен быть диапазон. Например, (factors [2 8 9] 12) => (2). Возможно, candidates подойдет. - person Thumbnail; 16.02.2016
comment
@Thumbnail Согласен. Я просто использовал range, потому что это было в исходном вопросе; Я обновил свой ответ, чтобы вместо этого использовать candidates. - person Sam Estep; 16.02.2016