在我的第一个Clojure项目中,除了最后的这一部分外,一切都很好:
(let [broken-signs (->> (:symbols field)
(map make-sign)
(filter broken?))
broken-count (count broken-signs)
unfixable-count (-> (filter (complement fixable?) broken-signs)
(count))]
(println
(if (> unfixable-count 0)
-1
(- broken-count unfixable-count))))
缩进看起来不起作用,因为我正在重用let块中的状态。我基本上是先计算破损标志的数量,然后再计算可固定标志的数量。如果任何符号不能固定,我将打印-1,否则将打印要固定的符号数量。
如果我两次映射/过滤,我将有重复的代码,但大多数情况下运行起来会更慢。尽管如此,有没有办法改进此代码?
(defn count-broken-yet-fixable []
(let [broken (->> (:symbols field)
(map make-sign)
(filter broken?))
unfixable (remove fixable? broken)]
(when (empty? unfixable)
(count broken))))
(defn solve-task []
(if-let [result (count-broken-yet-fixable)]
result
-1))
(println (solve-task))
确实没有必要进行减法运算,也不必在let块中进行计数。在错误的输入下输出-1也不是函数的工作,而只是任务的一部分。
我认为您的方法没有任何“非功能性”或错误之处。缩进看起来很好。
(let [broken (->> (:symbols field)
(map make-sign)
(filter broken?))
unfixable (remove fixable? broken)]
(when (seq unfixable)
(- (count broken) (count unfixable))))
filter (complement
为remove
pos?
代替(> n 0)
println
S的内部的if
,但实际上它是更好的返回值broken-count
绑定,因为它仅在一个地方使用unfixable
s处于有条件,你可以测试与价值seq
第一-1
以哨兵值返回,我会nil
改用;当when
不满足条件时自然会发生-1
的时候unfixable-count
是正的,只有当它不是正使用它的值(这是该装置零B / C数不能为负),例如,它可以被改写为(- broken-count 0)
公正,然后broken-count
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句