2014-09-23 59 views
4

由於recur只能用於尾部位置,我如何使用依賴於嵌套條件的值重複使用?這裏是一個例子:Clojure:使用基於條件的值重複使用的習慣方法

(loop [a (rand-int) b 0] 
    (if (< a 300) 
     (recur (rand-int) 1)) 
    (if (a < 10000) 
     (recur (rand-int) 5)) 
    b) 

問題是重複不發生在尾部位置。那麼如何循環取決於內部條件的新值呢?我可以做一個參考,並在條件中交換它,然後在尾部位置重複,但有沒有辦法做到這一點沒有價值突變?

回答

10

的復發都可以在尾部的位置:

(loop [a (rand-int 20000) b 0] 
    (if (< a 300) 
     (recur (rand-int 20000) 1) 
     (if (< a 10000) 
     (recur (rand-int 20000) 5) 
     b))) 

或許更多一點可讀:

(loop [a (rand-int 20000) b 0] 
    (cond 
    (< a 300) (recur (rand-int 20000) 1) 
    (< a 10000) (recur (rand-int 20000) 5) 
    :default b)) 
相關問題