如何迭代到Clojure中的固定点



我经常处于我的代码读作这样的位置:

(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停止。 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)

最新更新