首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >十进制到二进制的Clojure

十进制到二进制的Clojure
EN

Stack Overflow用户
提问于 2021-02-28 10:27:34
回答 3查看 387关注 0票数 2

我按照这段伪代码递归地将十进制转换为二进制。

代码语言:javascript
复制
findBinary(decimal)
   if (decimal == 0)
      binary = 0
   else
      binary = decimal % 2 + 10 * (findBinary(decimal / 2)

这是我尝试过的:

代码语言:javascript
复制
(defn binary [n]
  (loop [res 0]
    (if (= n 0)
    res
    (recur (res (* (+ (mod n 2) 10) (binary (quot n 2)))) )
    )
  )
)

但是我得到了这个错误:

代码语言:javascript
复制
ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn  user/binary (form-init9002795692676588773.clj:6)

有什么想法可以修复代码来完成任务吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-28 10:50:26

您的psuedo代码可以非常直接地用clojure表示:

代码语言:javascript
复制
(defn find-binary [decimal]
  (if (= decimal 0)
    0
    (+ (mod decimal 2) (* 10 (find-binary (quot decimal 2))))))

示例:

代码语言:javascript
复制
user=> (find-binary 1)
1
user=> (find-binary 2)
10
user=> (find-binary 25)
11001
user=> (find-binary 255)
11111111

您的版本中的错误如下:

代码语言:javascript
复制
(recur (res (* (+ (mod n 2) 10) (binary (quot n 2))))

具体地说,抱怨是您试图使用

(它的值为

)作为函数。

老实说,我不确定如何使用loop-recur来做到这一点。当我尝试它时,我抱怨recur不是从尾部位置。也许另一个答案可以启发我们!

票数 3
EN

Stack Overflow用户

发布于 2021-02-28 18:52:59

我意识到,这是一个过程,而不是结果。但要提到这一点:

可以给你带各种基数的字符串。

代码语言:javascript
复制
(Long/toString 123 2)
; → "1111011"
票数 6
EN

Stack Overflow用户

发布于 2021-02-28 12:33:40

这里有一个稍微不同的方法,它允许

使用:

代码语言:javascript
复制
(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))))))

在循环中,我们建立了一个二进制数字的集合,在列表的开头添加每个新的数字,这样我们就可以在列表中以从左到右的所需顺序结束数字。当达到终止条件时,我们将数字集合转换为字符串集合,将字符串集合连接成单个字符串,然后将字符串转换回整数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66405315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档