clojure中的除数函数

Hel*_*kin 5 functional-programming function clojure

我是clojure的新手,我想创建一个函数,它返回某个Number的所有除数的向量.

例如:
[1 2 3]为6作为输入

(defn div [x seq]
  (let [r  (range 1 (+ (/ x 2) 1)) ]   
    (dotimes [i (count (range 1 (+ (/ x 2) 1) ))]      
     (cond
      (= (mod x (nth r i )) 0)(print (conj  seq (nth r i ))) 
     ))))
Run Code Online (Sandbox Code Playgroud)

此函数以下列格式返回输出:
[1] [2] [4] [5] [10] [20] [25] [50]为100,但我想在一个向量中获得输出.似乎seq变量不断被每个循环步骤覆盖.谁能解释这种行为并为我提供一个解决方法?

在此先感谢您的问候

Gui*_*ler 10

您可以使用更惯用的解决方案来避免循环:

(defn divisors 
  [n]
  (filter (comp zero? (partial rem n)) (range 1 n)))
Run Code Online (Sandbox Code Playgroud)


tan*_*mer 4

我认为你的做法不正确,你可以看看:

  • 循环函数来解决此类问题(我的意思是您需要迭代和产生值情况),
  • 迭代函数
  • 递归函数(调用自身的函数)

这段代码(使用“ for ”函数)可以轻松解决您的规范

(let [n 100]
  (for [x (range 1 n)
       :when (zero? (rem n x))]
   x))
=>(1 2 4 5 10 20 25 50)
Run Code Online (Sandbox Code Playgroud)