【问题标题】:How to break out of a doseq?如何摆脱doseq?
【发布时间】:2013-10-31 08:41:25
【问题描述】:

我对 Clojure 比较陌生。我试图通过编写一个简单的方法isPrime 来使用doseq,该方法将返回真或假。

如果我发现一个特定的数字将 n 除以余数 0,我该如何返回 false 并退出 doseq 调用?

我怎么知道我一直走到列表的末尾?

我必须总是遍历列表中的所有元素吗?

我还应该使用一个原子作为标志来跟踪我是否找到了一个可以整除 n 的数字吗?

我被困在一个点上:

(defn isPrime
  #_=>  "Is the given number prime"
  #_=>  [n]
  #_=>  (doseq [i 2 (int (inc (Math/sqrt n)))]
  #_=>    (if (= (mod n i) 0)

【问题讨论】:

    标签: clojure


    【解决方案1】:

    doseq 不应用于此目的。您需要将编码风格从命令式转变为函数式。

    (doc doseq)
    Repeatedly executes body (presumably for side-effects) with
    bindings and filtering as provided by "for". Does not retain
    the head of the sequence. Returns nil.
    

    doseq 不应该像 Java 中的 forwhile 构造那样使用。

    查看这些实现以了解如何在 Clojure 中实现 is-prime:Clojure Euler - Problem 007

    【讨论】:

      【解决方案2】:

      可能有一种方法可以通过使用异常来突破doseq,但在这种情况下你真的不应该使用doseq。它不是为此类问题而设计的。

      另一方面,标准库函数not-any? 可以满足您的需求。在类似情况下,您还应该考虑not-any? 的兄弟姐妹some?every?not-every?

      这是一个示例解决方案,可以从您的代码中正确实现(非常天真的)算法:

      (defn prime?
        "Returns true if n is a prime number."
        [n]
        (not-any? #(zero? (mod n %))
                  (range 2 (inc (Math/sqrt n)))))
      

      【讨论】:

      • 谢谢我已经在这条赛道上了。我正在使用过滤器来取出可整除的那些并查看要决定的计数。我不知道 not-any!
      • 没有any?这样的东西。
      • @tar:对不起,那个人的名字some?。感谢您的通知,我已经更正了我的答案。
      猜你喜欢
      • 2014-01-28
      • 2020-10-19
      • 2019-12-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多