Clojure 用于查找x是否为y的倍数的函数

Clojure 用于查找x是否为y的倍数的函数,clojure,Clojure,请看下面的函数。我想传递一个因子向量,并测试向量中是否有任何元素是x的因子。我该怎么做 (defn multiple? "Takes a seq of factors, and returns true if x is multiple of any factor." ([x & factors] (for [e m] )) ([x factor] (= 0 (rem x factor)))) 您可以尝试使用和: 另外some返回nil如果所有测试都失败,如果您需要它实际返

请看下面的函数。我想传递一个因子向量,并测试向量中是否有任何元素是
x
的因子。我该怎么做

(defn multiple?
  "Takes a seq of factors, and returns true if x is multiple of any factor."
  ([x & factors] (for [e m] ))
  ([x factor] (= 0 (rem x factor))))
您可以尝试使用和:

另外
some
返回
nil
如果所有测试都失败,如果您需要它实际返回
false
,您可以在其中添加一个:

(defn multiple? [x & factors]
  (true? (some zero? (map #(rem x %) factors))))

请注意,
some
短路和
map
是惰性的,因此只要找到匹配项,
multiple?
就会停止。e、 g.以下代码针对序列
1,2,3,4,…
进行测试

=> (apply multiple? 10 (map inc (range)))
true

显然,只有当
multiple?
没有对序列中的每个数字进行测试时,此计算才能终止。

尝试使用显式尾部递归:

(defn multiple? [x factors]
  "if any of the elements in the vector is a factor of x"
  (loop [factors factors]
        (cond (empty? factors) false
              (zero?  (rem x (first factors))) true
              :else   (recur (rest factors)))))
上述解决方案的优点包括:一旦发现向量中的任何元素是
x
的因子,它就会停止,而不会迭代整个向量;由于使用了尾部递归,它的效率很高,并且在恒定的空间中运行;它直接返回一个布尔结果,不需要考虑返回<代码> nIL/COD>的情况。像这样使用它:

(multiple? 10 [3 4])
=> false

(multiple? 10 [3 4 5 6])
=> true

如果您不想显式地传递一个向量(用于像这样调用过程:
(multiple?10 3 4 5 6)
),那么只需向参数列表中添加一个
&
,就像问题中一样。

您只能使用
一些
来解决它

=> (defn multiple? [x factors]
 (some #(zero? (rem x %)) factors))
#'user/multiple?
=> (= true (multiple? 10 [3 4]))
false
=> (= true (multiple? 10 [3 4 5 6]))
true
有些
会在第一个因子处停止。

一种更为简单的方法是编写一个更通用的函数:它将返回
x的所有因子,而不是回答真/假问题。因为序列是惰性的,所以如果你想知道它是否为空,它几乎同样有效

(defn factors [x & fs]
  (for [f fs :when (zero? (rem x f))] f))

(factors 5 2 3 4)
=> ()

(factors 6 2 3 4) 
=> (2 3)
然后,您只需使用
empty?
即可回答原始问题:

(empty? (factors 5 2 3 4))
=> true

(empty? (factors 6 2 3 4))
=> false

映射
/
某些
解决方案表现出相同的行为。(它不会测试序列中的每个数字。)啊,发布与另一个答案相同的答案是不礼貌的,尤其是因为你的答案比原始答案晚了20分钟以上。@dbaupp我认为我的答案与你的答案不一样。这一个只使用一些
。你用的是
一些
地图
。啊,我错过了。我的道歉。:)(另外,
true?
是一种更简洁的方式来编写
=true
)你是对的。我想我是从……那里养成了习惯使用
filter
更惯用于
(filter#(zero?(rem x%))fs)
我同意,这是一个很好的评论。我使用了
for
,因为@murtaza52试图在问题本身中使用它。
(empty? (factors 5 2 3 4))
=> true

(empty? (factors 6 2 3 4))
=> false