วิธีคืนตัวเลขที่สอดคล้องกันเมื่อภาคแสดงเป็นจริงในการปิดบัง

ฉันต้องการส่งกลับตัวประกอบของตัวเลข และตัวประกอบเหล่านั้นควรอยู่ในช่วงที่กำหนด ชอบ:

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

ฉันเขียนโค้ดบางส่วนแต่กลับเป็นจริงหรือเท็จ รหัสของฉันคือ:

(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) แทนที่จะเป็นจริงและเท็จได้อย่างไร ขอบคุณมาก!


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
@ภาพขนาดย่อตกลง ฉันเพิ่งใช้ range เพราะมันเป็นคำถามเดิม ฉันอัปเดตคำตอบเพื่อใช้ candidates แทน - person Sam Estep; 16.02.2016