Clojure:使用基于条件的值重复出现的惯用方法

Clojure:使用基于条件的值重复出现的惯用方法,clojure,Clojure,由于recur只能在尾部位置使用,如何使用依赖于嵌套条件的值进行recur?以下是一个例子: (loop [a (rand-int) b 0] (if (< a 300) (recur (rand-int) 1)) (if (a < 10000) (recur (rand-int) 5)) b) (循环[a(rand int)b0] (如果(

由于recur只能在尾部位置使用,如何使用依赖于嵌套条件的值进行recur?以下是一个例子:

(loop [a (rand-int) b 0]
    (if (< a 300)
       (recur (rand-int) 1))
    (if (a < 10000)
       (recur (rand-int) 5))
    b)
(循环[a(rand int)b0]
(如果(

问题是递归不会发生在尾部位置。那么,如何使用依赖于内部条件的新值进行循环呢。我可以创建一个引用并在条件中交换它,然后在尾部位置重复出现,但是有没有一种方法可以在不改变值的情况下进行呢

递归可以全部处于尾部位置:

(loop [a (rand-int 20000) b 0]
    (if (< a 300)
       (recur (rand-int 20000) 1)
       (if (< a 10000)
         (recur (rand-int 20000) 5)
         b)))
(循环[a(rand int 20000)b0]
(如果(
或者更具可读性:

(loop [a (rand-int 20000) b 0]
  (cond 
    (< a 300)   (recur (rand-int 20000) 1)
    (< a 10000) (recur (rand-int 20000) 5)
    :default    b))
(循环[a(rand int 20000)b0]
(续)
(