Вот почему у вас проблема:
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)
Это исправление:
user> (take 10 (iterate #(quot % 10) 10923))
(10923 1092 109 10 1 0 0 0 0 0)
Это выражение, которое вы ищете:
user> (count (take-while #(not (zero? %)) (iterate #(quot % 10) 10923)))
5
Это обман:
user> (count (str 10923))
5
Это функция, которую вы пытались написать (но будьте осторожны, она будет переполняться при большом количестве):
user> (defn num-digits [n]
(if (= 0 n)
0
(inc (num-digits (quot n 10)))))
#'user/num-digits
user> (num-digits 10923)
5
Однако, это вызов:
user> (num-digits 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000)
158
Эта версия этой функции не создает стек:
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
Все версии интересны по-своему. Хороший вопрос!