在scala中整数到二进制

时间:2014-04-06 22:34:24

标签: scala recursion binary

仅仅为了踢,我决定编写一个取整数并将其转换为二进制的片段。它似乎正在执行转换,但我想知道是否有任何我可能会遗漏的东西。得到一些反馈会很棒。

由于

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)
  }
}

4 个答案:

答案 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)
}