如何在Clojure中正确绑定循环中更大和更小的值?

时间:2017-04-17 11:14:39

标签: clojure

我需要正确绑定loop中初始绑定中较大和较小的值。这些值以临时顺序提供,因此我需要先区分它们。 loop本身在匿名函数中使用。

所以,我需要做类似的事情:

(#(loop [divident %1 divisor %2] (some-recursion)) greater lesser)

或者,在交换参数的情况下:

(#(loop [divident %2 divisor %1] (some-recursion)) lesser greater)

3 个答案:

答案 0 :(得分:1)

如果您需要按从大到小的顺序排列值,那么您可以使用函数sortsort-by。例如:

(sort [1 7 4 6])
;;=> (1 4 6 7)
(sort-by - [1 7 4 6])
;;=> (7 6 4 1)

因此,对于两个数字,您可以轻松地对排序结果进行解构:

(let [[lesser greater] (sort [7 1])]
  (println lesser greater))
;;=> 1 7

将其应用于loop

(defn x-1 []
  (#(let [[lesser greater] (sort [%1 %2])]
      (loop [bigger greater
             smaller lesser]
        (println smaller bigger))) 7 1))
;;=> 1 7

答案 1 :(得分:0)

不确定这是一个正确的解决方案,但是:我们可以执行任何初始绑定,而不是在第一个递归循环中执行相应的绑定开关。

以下是Euclidean algorithm作为匿名函数实现的示例:

(#(loop [dd %1 dr %2]
  (if (zero? (rem dd dr))
    dr
    (recur dr (rem dd dr))))
  858 1023)
;; -> 33

(#(loop [dd %1 dr %2]
  (if (zero? (rem dd dr))
    dr
    (recur dr (rem dd dr))))
  1023 858)
;; -> 33

答案 2 :(得分:0)

对于两个数字,最简单的方法是在max绑定中使用minloop

(#(loop [dividend (max %2 %1)
         divisor (min %2 %1)]
    (println (format "larger: %d   smaller: %d" dividend divisor)))
  2 1)