3用于Clojure的总和

马里奥安慰

我进行了一次经典的算法练习:此数组中有多少个三元组加和为零?用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;

但是我将如何在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])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章