我想生成0到2 ^ n-1的n
位二进制数。例如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")
但是这些代码看起来有点冗长。 是不是有更好的方法或更多的方法来做到这一点?
答案 0 :(得分:7)
您可以使用cl-format中的clojure.pprint来简化格式:
(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)
。
表达此问题的另一种方式是selections来自clojure.math.combinatorics:
(defn binary-permutation [n]
(map (partial apply str) (selections [0 1] n)))
答案 1 :(得分: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))))