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