带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…)子句看起来非常自然