我有这个经典的算法练习:在这个数组中有多少三倍总和为零?在Java中实现这个没问题:
int count = 0;
for (int i = 0; i < array.length - 2; i++) {
(for int j= i+1; j < array.length -1; j++) {
(for int k = j + 1; k < array.length; k++) {
if (array[i] + array[j] + array[k] == 0) {
count++;
}
}
}
}
return count;
Run Code Online (Sandbox Code Playgroud)
我怎么会在Clojure中这样做呢?我问自己:我怎么能在Clojure中做嵌套循环.
但是这个问题和答案并没有真正解决我的问题,因为它需要两个相同的数组并组合所有元素(也是相同的元素,例如1和1).
相关问题:如何从集合中获取三元组的所有组合?
注意:我们明确要求不对数组进行排序.我知道有更快的算法.
编辑:添加"== 0"条件.
你也可以使用列表理解,而不需要运行索引:
user> (def data [1 -2 1 1 -3 2])
#'user/data
user> (defn tails [data]
(take-while seq (iterate rest data)))
#'user/tails
user> (for [[x & xs] (tails data)
[y & ys] (tails xs)
[z] (tails ys)
:when (zero? (+ x y z))]
[x y z])
;;=> ([1 -2 1] [1 -2 1] [1 -3 2] [-2 1 1] [1 -3 2] [1 -3 2])
Run Code Online (Sandbox Code Playgroud)