recursion - 用于计算组合的尾递归 Clojure 函数

标签 recursion clojure functional-programming tail-recursion

我有一个函数,给定一个向量,返回所有无序组合:

(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 核心或库函数,因为这肯定是我对“惯用”定义的一部分。 :)

最佳答案

Clojure 有 clojure.math.combinatorics,其中包含许多方便的函数。因此,可以说,在 Clojure 中执行操作的“惯用”方法是导入/需要 clojure.math.combinatorics,然后简单地调用 n = 2 的组合。

...>  (comb/combinations [1 2 3 4] 2)
((1 2) (1 3) (1 4) (2 3) (2 4) (3 4))

为此,您需要首先添加正确的依赖项。

在我撰写本文时,最新版本是:[org.clojure/math.combinatorics "0.0.7"]

然后我确实需要它“:as Comb”:

(:require [clojure.math.combinatorics :as comb]

如果您不想使用math.combinatorics,您可以编辑您的问题以使其精确,我将删除我的答案。

关于recursion - 用于计算组合的尾递归 Clojure 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22453166/

相关文章:

recursion - 方案中的汉诺塔(递归)

Clojure 程序读取自己的 MANIFEST.MF

objective-c - 如何快速转换 valueForKeyPath

Scala - 根据逻辑添加元素

c++ - 递归中 void 的无效操作数

go - 递归内部函数 Golang

java - 火狐未连接异常

performance - `modify` 什么时候复制向量?

recursion - Clojure - "get"和 "nth"的混合?

algorithm - RRB 树保持什么不变性?