仅仅为了踢,我决定编写一个取整数并将其转换为二进制的片段。它似乎正在执行转换,但我想知道是否有任何我可能会遗漏的东西。得到一些反馈会很棒。
由于
def convertToBinary(n: Int, bin: List[Int]): String = {
if(n/2 == 1) {
(1::(n%2)::bin).mkString(" ")
} else {
val r = n%2;val q = n/2;converttobinary(q,r::bin)
}
}
答案 0 :(得分:5)
def toBinary(n: Int): String = n.toBinaryString
答案 1 :(得分:3)
1)格式化: - )
def converttobinary(n:Int, bin:List[Int]):String = {
if(n/2 == 1) (1:: (n % 2) :: bin).mkString(" ")
else {
val r = n % 2;
val q = n / 2;
converttobinary(q, r::bin)
}
}
2)签名:
我会省略转换部分,使得累加器可选参数(函数用户不必提供仅用于内部实现的参数,对吧?)
def toBinary(n:Int, bin: List[Int] = List.empty[Int]): String = {
if(n/2 == 1) (1:: (n % 2) :: bin).mkString(" ")
else {
val r = n % 2
val q = n / 2
toBinary(q, r::bin)
}
}
现在它可以用作:
val str = toBinary(42)
有人可能会建议你使用pimp这样的功能,所以调用可能看起来像
val str = 42.toBinary // btw, there is such function in std lib: 42.toBinaryString
但我没有多少利润。
困扰我的另一件事是你正在使用List& mkString为此目的,为什么不是StringBuilder?什么是q和r?
最后一个小点 - 放置@annotation.tailrec
以确保即使在将来发生任何变化时也会优化功能
答案 2 :(得分:3)
1)简短的一个:
scala> def toBinary(n: Int): String = n match {
| case 0|1 => s"$n"
| case _ => s"${toBinary(n/2)}${n%2}"
| }
toBinary: (n: Int)String
scala> toBinary(155)
res0: String = 10011011
答案 3 :(得分:1)
尾递归
def toBinary(n: Int): String = {
@tailrec def binary(acc: String, n: Int): String = {
n match {
case 0 | 1 => n+acc
case _ => binary((n % 2)+acc, (n / 2))
}
}
binary("",n)
}