如何在Clojure中拆分数字?

如何在Clojure中拆分数字?,clojure,Clojure,我正在寻找一种在Clojure中拆分n位数字的好方法我有以下两种方法: (->> (str 942) seq (map str) (map read-string)) => (9 4 2) 而且 (defn digits [n] (cons (str (mod n 10)) (lazy-seq (positive-numbers (quot n 10))))) (map read-string (reverse (t

我正在寻找一种在Clojure中拆分n位数字的好方法我有以下两种方法:

 (->> (str 942)
      seq
      (map str)
      (map read-string)) => (9 4 2)
而且

(defn digits [n]
   (cons 
      (str (mod n 10)) (lazy-seq (positive-numbers (quot n 10)))))

(map read-string (reverse (take 5 (digits 10012)))) => (1 0 0 1 2)
有没有更简洁的方法来执行这种类型的操作?

您可以简单地执行

(映射#(字符/数字%10)(str 942))

编辑:添加函数定义

(defn digits [number] (map #(Character/digit % 10) (str number)))
用法:

(digits 1234)
注意:这是简洁的,但使用java字符串和字符类。可以使用整数模运算编写一个高效的实现,但不会很简洁。与查尔斯的答案类似的一种解决方案是:

(defn numTodigits
  [num]
  (loop [n num res []]
    (if (zero? n)
      res
      (recur (quot n 10) (cons (mod n 10) res)))))

我不确定简明,但这一方法避免了不必要的低效,例如转换为字符串和返回整数

(defn digits [n]
  (loop [result (list), n n]
    (if (pos? n)
      (recur (conj result (rem n 10))
             (quot n 10))
      result)))

递归实现(可能更高效、更不简洁,但对于合理的数字来说并不重要)


第一种方法的简明版本如下:

(defn digits [n]
  (->> n str (map (comp read-string str))))
。。。你的第二个目标是

(defn digits [n]
  (if (pos? n)
    (conj (digits (quot n 10)) (mod n 10) )
    []))
惯用的替代方法

(defn digits [n]
  (->> n
       (iterate #(quot % 10))
       (take-while pos?)
       (mapv #(mod % 10))
       rseq))
比如说,

(map digits [0 942 -3])
;(nil (9 4 2) nil)
  • 由于计算中的最后一个数字是 先出。因此,我们不妨使用
    mapv
    rseq
    (而不是
    map
    reverse
    )来加快速度
  • 该功能已准备就绪
  • 它只能在正数上正常工作
      循环方法:

       (defn split-numbers [number]
         (loop [itr 0 res [] n number]
           (if (= n 0)
             res
             (recur (inc itr) (concat (vector (mod n 10)) res) (int (/ n 10)))
             )
           )
         )
      
      我能找到的最简单的方法是:

      (->> (str n)
         seq
         (map (comp read-string str)))
      

      在处理非常大的数字时,需要小心这里的堆栈用完。仅为
      concat
      构建单个项向量不是一个好主意。由于
      (mod n 10)
      的结果总是一个数字,
      conj
      cons
      将是更好的选择。@mujuk
      cons
      conj
      将建立反向列表@查尔斯:我同意,我只是想写些简洁的东西。如果要求说明输入可能有数千位数字,我就不会使用纯递归。@Diego,conj是构建正向列表还是反向列表取决于您的集合类型。您可以将第一个方法简化为
      (>>942 str(map(comp read string str))
      。确实如此!非常感谢;)我把它和你的第二种方法的相应缩写添加到。
      (->> (str n)
         seq
         (map (comp read-string str)))