6

我想生成n从 0 到 2^n-1 的二进制数字。例如 3 位数字,“000”、“001”、“010”、...、“111”(十进制的 0 到 7)。我使用的方法是使用java.lang.Integer.toBinaryString()方法并在必要时添加零,如下所示:

(defn pad-zero [s n]
  (str (reduce str (repeat (- n (count s)) "0")) s))

(defn binary-permutation [n]
  (map (fn [s] (pad-zero s n))
       (map #(Integer/toBinaryString %) (range 0 (Math/pow 2 n)))))

使用这段代码,我可以像这样生成我想要的东西。3位数:

(binary-permutation 3)
=> ("000" "001" "010" "011" "100" "101" "110" "111")

但是这段代码看起来有点冗长。有没有更好或更clojure的方法来做到这一点?

4

2 回答 2

7

您可以使用clojure.pprint中的cl-format简化格式设置:

(defn binary-permutation [n]
  (map (partial cl-format nil "~v,'0B" n) (range 0 (Math/pow 2 n))))

您可能也有兴趣知道这(Math/pow 2 n)相当于(bit-shift-left 1 n).

另一种表达方式是从clojure.math.combinatorics中进行选择

(defn binary-permutation [n]
  (map (partial apply str) (selections [0 1] n)))
于 2012-08-22T06:50:27.443 回答
2
(defn binary-permutation [n]
  (for [x (range (Math/pow 2 n))]
    (apply str (reverse (take n (map #(bit-and 1 %) (iterate #(bit-shift-right % 1) x)))))))

(defn pad-zero [s n]
  (apply str (take-last n (concat (repeat n \0) s))))
于 2012-08-22T12:19:48.113 回答