我经常处于这样的位置:我的代码如下所示:
(iterate improve x)
我正在寻找第一个值,该值不再比前一个值有所改进。两者都不filter
nor take-while
帮助他们找到一个明显的解决方案。然而,我犹豫着要不要写出来:
(loop [current x
next (improve x)]
(if (= current next)
current
(recur next (improve next))))
or:
(let [improvements (iterate improve x)]
(->> (map vector improvements (rest improvements))
(filter (partial apply =))
(ffirst)))
因为在某些时候这会变得重复,并且定点迭代肯定是一项基本任务,必须在某个地方有某种库支持,对吧?
您可以使用reduce
and reduced
必要时停止。reduced https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/reduced将参数包装在一个特殊的对象中,该对象reduce
旨在查找并立即停止处理返回包装值。
(def vals (iterate improve x))
(reduce #(if (= %1 %2) (reduced %1) %2) vals)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)