首页 > 解决方案 > Clojure 是素数函数?

问题描述

我正在做is-prime?的函数应该在 n 是素数时返回 true,否则返回 false,它还应该检查 n 是 1 还是 2 并做出相应的响应;如果没有,它应该调用no-divisors函数。目前我得到这个输出:

任何人都可以看到什么是错的,将不胜感激

expected result is false,current false
expected result is true,current true
expected result is true,current false
expected result is false,current false
expected result is true,current false

没有除数?

(->> (range 2 n)
(filter #(Divides % n))
empty? ))
(println (no-divisors? 4))

是素数吗?

(defn is-prime? [n]
(and (< 1 n)
(not-any? (filter #(no-divisors? % n))
(range 2 n))))
(println  "expected result is false,current"( is-prime? 1))
(println "expected result is true,current"( is-prime? 2))
(println "expected result is true,current" ( is-prime? 3))
(println "expected result is false,current"( is-prime? 4))
(println "expected result is true,current"( is-prime? 101))

标签: clojure

解决方案


如果您按照 Clojure 约定格式化您的代码,那么很明显问题出在哪里:

(defn is-prime? [n]
  (and (< 1 n)
       (not-any? (filter #(no-divisors? % n))
                 (range 2 n))))

您使用filter单个参数调用,该参数返回一个传感器。您对not-any?then 的调用尝试将该转换器视为谓词,并且由于转换器在给定单个参数的情况下返回一个函数 - 并且一个函数是“真实的”(不是nilor false)然后not-any?false根据其定义返回。

它返回的原因true2(range 2 2)是一个空序列,并且在不调用谓词的情况下not-any?返回一个空序列。true


推荐阅读