StackOverFlow在计算数字时

use*_*855 9 clojure

我试图计算Clojure中数字的位数,如下所示:即使是2位数,我也得到StackOverflowError

(defn num-digits [n]
   (if (= 0 n)
   0
   (inc (num-digits (/ n 10)))))
(println (num-digits 93))
Run Code Online (Sandbox Code Playgroud)

但是如果我用/ unchecked-divide替换/那么它至少可以工作93.但是这两种技术都不适用于:

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

首先,我想知道如何在Clojure中执行C风格的划分.每当我做(/ xy)时,我得到一个比率而不是一个整数.这样做的方法是什么?

其次,有没有一种方法API将此数字转换为数字向量和调用计数.

谢谢,
Ajay G.

Joh*_*den 8

这就是你遇到问题的原因:

user> (take 10 (iterate #(/ % 10) 10923))

(10923 10923/10 10923/100 10923/1000 10923/10000 10923/100000 10923/1000000 10923/10000000 10923/100000000 10923/1000000000)
Run Code Online (Sandbox Code Playgroud)

这是修复:

user> (take 10 (iterate #(quot % 10) 10923))

(10923 1092 109 10 1 0 0 0 0 0)
Run Code Online (Sandbox Code Playgroud)

这是您正在寻找的表达方式:

user> (count (take-while #(not (zero? %)) (iterate #(quot % 10) 10923)))
5
Run Code Online (Sandbox Code Playgroud)

这是作弊:

user> (count (str 10923))
5
Run Code Online (Sandbox Code Playgroud)

这是你试图编写的函数(但是要小心,它会为大数字堆栈溢出):

user> (defn num-digits [n]
        (if (= 0 n)
          0
          (inc (num-digits (quot n 10)))))

#'user/num-digits
user> (num-digits 10923)
5
Run Code Online (Sandbox Code Playgroud)

但是,它取决于挑战:

user> (num-digits 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000)

158
Run Code Online (Sandbox Code Playgroud)

该函数的这个版本不会打击堆栈:

user> (defn num-digits-tail-recursion 
        ([n count]
           (if (= 0 n)
             count
             (recur (quot n 10) (inc count))))
        ([n] (num-digits-tail-recursion n 0)))
#'user/num-digits-tail-recursion
user> (num-digits-tail-recursion 10923)
5
Run Code Online (Sandbox Code Playgroud)

所有版本都以自己的方式很有趣.好问题!


Mar*_*ers 3

根据此页面,您可以使用以下方法在 Clojure 中执行整数除法quot

(quot n 10)
Run Code Online (Sandbox Code Playgroud)