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)
因为在某些时候这变得重复,并且确定定点迭代是一项基本任务,某些地方必须有某种类型的库支持,对吧?
您可以在必要时使用reduce和reduced停止.reduced将参数包装在一个特殊对象中,该对象reduce旨在查找并停止处理,立即返回包装的值.
(def vals (iterate improve x))
(reduce #(if (= %1 %2) (reduced %1) %2) vals)
Run Code Online (Sandbox Code Playgroud)