Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带cond的Clojure循环_Clojure_Prime Factoring - Fatal编程技术网

带cond的Clojure循环

带cond的Clojure循环,clojure,prime-factoring,Clojure,Prime Factoring,我正在处理一个涉及数字分解的问题,并编写了以下函数来实现这一点 (defn get-factors [value] (let [max-factor (->> (Math/sqrt value) (Math/floor) (Math/round)) ifactors #{}] (loop [n 2 factors ifactors] (do

我正在处理一个涉及数字分解的问题,并编写了以下函数来实现这一点

(defn get-factors [value]
  (let [max-factor (->> (Math/sqrt value)
                        (Math/floor)
                        (Math/round))
        ifactors #{}]
   (loop [n 2 factors ifactors]
     (do 
       (println (format ">> N: %d, Factors: %s" n factors))
       (cond
        (when (> n max-factor)   ; exit of we have passed the max-factor
          (do 
            (println (format "--Exiting(%d): %s" n factors))
            factors))               ; return factors
        (when (= 0 (mod value n)); have we found a factor?   
          (do 
            (println (format"--Factor(%d)" n))
            (recur (inc n) (conj factors n (/ value n)))))   ; recurse: add _n_ and reciprocal _n_ to list
        :default (do             ; otherwise
                   (println (format"--default(%d): %s" n (= 0 (mod value n))))
                   (recur (inc n) factors)) ; recurse: increment _n_, dont modify factors
        )))))
但是,函数返回的是
nil
,我的println语句的计算顺序很奇怪。下面是REPL for
(get factors 12)
的输出,它应该返回
{2,3,4,6}

>> N: 2, Factors: #{}
--default(2): true
>> N: 3, Factors: #{}
--default(3): true
>> N: 4, Factors: #{}
--Exiting(4): #{}
--Factor(4)
>> N: 5, Factors: #{3 4}
--Exiting(5): #{3 4}
如您所见,即使上一个案例的
(=0(mod value n))
计算结果为true,默认状态仍被命中。同样地,退出条件被击中两次。评估的最后一个案例应该是n=3,但您最多可以看到n=5的输出


很明显,我在做一些根本错误的事情,但我看不到什么。(相关,是否有更好的方法来构建列表?

首先,在任何
条件的测试部分都有一个隐式的“when”(或“if”),因此您不应该在该测试中使用
when
自己

其次,您正在使用一个表单,即
when
表单,作为
cond
的整个分支,因此,当测试为真时,
cond
不会看到它期望的第二个表单

查看此正确的
条件的示例:


如果像其他人建议的那样,当
s和
do和printlns时,你去除了所有积垢-你的程序工作正常

一些建议:

  • 使用
    quot
    而不是
    /
    获取整数商
  • 您也可以这样启动线程宏:
    (>>value(Math/sqrt)…
  • 使用
    :else
    ,而不是
    :default
    或任何其他方法在
    条件中引入catch all子句

首先,您需要为
cond
提供一对表达式-一个测试表达式和一个用于评估测试是否通过的表达式:
(cond(>x10)(print“x是gt 10”),(
。删除
when
wrappers.danneu我认为这是实际的答案。谢谢你的帮助。我整个下午都在关注这个问题,知道它很简单。我曾经做过很多繁重的xsl脚本编写,所以(when…)子句看起来非常自然