我需要正确绑定loop
中初始绑定中较大和较小的值。这些值以临时顺序提供,因此我需要先区分它们。 loop
本身在匿名函数中使用。
所以,我需要做类似的事情:
(#(loop [divident %1 divisor %2] (some-recursion)) greater lesser)
或者,在交换参数的情况下:
(#(loop [divident %2 divisor %1] (some-recursion)) lesser greater)
答案 0 :(得分:1)
如果您需要按从大到小的顺序排列值,那么您可以使用函数sort
和sort-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
绑定中使用min
和loop
:
(#(loop [dividend (max %2 %1)
divisor (min %2 %1)]
(println (format "larger: %d smaller: %d" dividend divisor)))
2 1)