如何在Clojure中拆分数字?
我正在寻找一种在Clojure中拆分n位数字的好方法我有以下两种方法:如何在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
(->> (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
将是更好的选择。@mujukcons
或cons
将建立反向列表@查尔斯:我同意,我只是想写些简洁的东西。如果要求说明输入可能有数千位数字,我就不会使用纯递归。@Diego,conj是构建正向列表还是反向列表取决于您的集合类型。您可以将第一个方法简化为conj
。确实如此!非常感谢;)我把它和你的第二种方法的相应缩写添加到。(>>942 str(map(comp read string str))
(->> (str n) seq (map (comp read-string str)))