2017-06-10 54 views
2

我經常在我,我的代碼讀取,像這樣的位置:如何迭代直到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))) 

因爲在某些時候,這正成爲重複和可靠地固定點迭代是這樣的基本任務,必須有某種某處的圖書館支持,對嗎?

回答

7

您可以使用reducereduced停止在必要的時候。 reduced將參數包裝在一個特殊的對象中,其中reduce被設計爲查找並停止處理,立即返回包裝的值。

(def vals (iterate improve x)) 

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

你可以使用drop-while然後first

(defn still-improving? [[x y]] 
    ...) 

(->> st 
    (iterate transition) 
    (partition 2 1) 
    (drop-while still-improving?) 
    ffirst)