我经常处于我的代码如下所示的位置:
(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
停止。 reduced 将参数包装在一个特殊的对象中,reduce
旨在查找并立即停止处理并返回包装的值。
(def vals (iterate improve x))
(reduce #(if (= %1 %2) (reduced %1) %2) vals)
关于clojure - 如何迭代直到 Clojure 中的一个固定点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44478322/