如何迭代直到Clojure中的一个固定点?

Seb*_*off 2 iteration clojure fixed-point-iteration

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

(iterate improve x)
Run Code Online (Sandbox Code Playgroud)

而且我正在寻找第一个不再比以前更好的价值.既不是filter也不take-while适合明显的解决方案.但是,我犹豫要写出来:

(loop [current x
       next (improve x)]
  (if (= current next)
    current
    (recur next (improve next))))
Run Code Online (Sandbox Code Playgroud)

要么:

(let [improvements (iterate improve x)]
  (->> (map vector improvements (rest improvements))
    (filter (partial apply =))
    (ffirst)))
Run Code Online (Sandbox Code Playgroud)

因为在某些时候这变得重复,并且确定定点迭代是一项基本任务,某些地方必须有某种类型的库支持,对吧?

ez1*_*1sl 9

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

(def vals (iterate improve x))

(reduce #(if (= %1 %2) (reduced %1) %2) vals)
Run Code Online (Sandbox Code Playgroud)