我经常处于我的代码读作这样的位置:
(iterate improve x)
我正在寻找第一个不再比以前的值有所改进的值。filter
和take-while
都不适合一个明显的解决办法。但是,我犹豫要不要写出来:
(loop [current x
next (improve x)]
(if (= current next)
current
(recur next (improve next))))
或:
(let [improvements (iterate improve x)]
(->> (map vector improvements (rest improvements))
(filter (partial apply =))
(ffirst)))
因为在某些时候,这变得重复,并且定点迭代肯定是一项基本任务,以至于必须在某处提供某种库支持,对吧?
必要时可以使用
reduce
和reduced
停止。 reduce 将参数包装在一个特殊对象中,reduce
该对象旨在查找并立即停止处理,返回包装的值。
(def vals (iterate improve x))
(reduce #(if (= %1 %2) (reduced %1) %2) vals)
您可以使用
drop-while
然后first
:
(defn still-improving? [[x y]]
...)
(->> st
(iterate transition)
(partition 2 1)
(drop-while still-improving?)
ffirst)