我按照这段伪代码递归地将十进制转换为二进制。
findBinary(decimal)
if (decimal == 0)
binary = 0
else
binary = decimal % 2 + 10 * (findBinary(decimal / 2)这是我尝试过的:
(defn binary [n]
(loop [res 0]
(if (= n 0)
res
(recur (res (* (+ (mod n 2) 10) (binary (quot n 2)))) )
)
)
)但是我得到了这个错误:
ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn user/binary (form-init9002795692676588773.clj:6)有什么想法可以修复代码来完成任务吗?
发布于 2021-02-28 10:50:26
您的psuedo代码可以非常直接地用clojure表示:
(defn find-binary [decimal]
(if (= decimal 0)
0
(+ (mod decimal 2) (* 10 (find-binary (quot decimal 2))))))示例:
user=> (find-binary 1)
1
user=> (find-binary 2)
10
user=> (find-binary 25)
11001
user=> (find-binary 255)
11111111您的版本中的错误如下:
(recur (res (* (+ (mod n 2) 10) (binary (quot n 2))))具体地说,抱怨是您试图使用
(它的值为
)作为函数。
老实说,我不确定如何使用loop-recur来做到这一点。当我尝试它时,我抱怨recur不是从尾部位置。也许另一个答案可以启发我们!
发布于 2021-02-28 18:52:59
我意识到,这是一个过程,而不是结果。但要提到这一点:
可以给你带各种基数的字符串。
(Long/toString 123 2)
; → "1111011"发布于 2021-02-28 12:33:40
这里有一个稍微不同的方法,它允许
使用:
(defn find-binary [d]
(loop [ decimal d
digits '() ]
(if (= decimal 0)
(Integer. (clojure.string/join (map str digits)))
(recur (quot decimal 2) (conj digits (mod decimal 2))))))在循环中,我们建立了一个二进制数字的集合,在列表的开头添加每个新的数字,这样我们就可以在列表中以从左到右的所需顺序结束数字。当达到终止条件时,我们将数字集合转换为字符串集合,将字符串集合连接成单个字符串,然后将字符串转换回整数。
https://stackoverflow.com/questions/66405315
复制相似问题