我经常处于我的代码如下所示的位置:

(iterate improve x)

我正在寻找第一个不再比前一个有所改进的值。 filtertake-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)))

因为在某些时候这会变得重复,而且定点迭代肯定是一项基本任务,以至于某处必须有某种库支持,对吗?

最佳答案

必要时可以使用 reducereduced 停止。 reduced 将参数包装在一个特殊的对象中,reduce 旨在查找并立即停止处理并返回包装的值。

(def vals (iterate improve x))

(reduce #(if (= %1 %2) (reduced %1) %2) vals)

关于clojure - 如何迭代直到 Clojure 中的一个固定点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44478322/

10-12 22:56