【发布时间】:2023-03-10 02:02:01
【问题描述】:
我有一个函数,给定一个向量,返回所有无序组合:
(defn combination [ps]
(loop [acc []
ps ps]
(if (= 2 (count ps))
(conj acc (apply vector ps))
(recur (apply conj acc (map #(vector (first ps) %) (rest ps)))
(rest ps)))))
这很好用,但对我来说似乎有点令人费解。
在 Clojure 中是否有更直接、更惯用的方式来完成此任务?我很高兴使用 Clojure 核心或库函数,因为这肯定是我对“惯用”定义的一部分。 :)
【问题讨论】:
-
您可以将
(apply vector ps)替换为(vec ps) -
...
(count ps)小于 2 时崩溃。(case (count ps), (0 1) (), 2 (conj ... ), (recur ... ))可能。 -
好点。我只是在查看代码并认为
(= 2 ...)有点代码味道。你会很高兴知道我在程序中用你的函数替换了我的函数,这导致我提出这个问题。 :)
标签: recursion clojure functional-programming tail-recursion