2013-10-22 43 views
3

我對Clojure比較陌生。我試圖通過編寫一個簡單的方法isPrime來使用doseq,它將返回true或false。如何突破doseq?

如果我發現一個特定的數字要用餘數0除n,我該如何返回false並跳出doseq調用?

我怎麼知道我一路走到名單的最後?

我是否必須經常瀏覽列表中的所有元素?

另外我應該使用一個原子作爲一個標誌來跟蹤我是否找到一個數字是否分爲n?

我堅持在一個點上:

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

回答

3

有可能是通過使用異常跳出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))))) 
+0

謝謝你,我已經在這條賽道。我正在使用過濾器來清除那些可以分割的數據,然後查看數量來決定。 我不知道沒有! –

+0

沒有'任何?'這樣的東西。 – tar

+0

@tar:對不起,那個人的名字是'some?'。感謝通知,我更正了我的答案。 –

2

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中。

看一看這些實施方案中有關於如何實現的感覺是貸Clojure中:Clojure Euler - Problem 007