scala中的整数到二进制

scala中的整数到二进制,scala,recursion,binary,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) } }

为了好玩,我决定写一个代码段,将整数转换成二进制。它似乎正在执行转换,但我想知道是否有什么我可能会错过这一点。如果能得到一些反馈就太好了

谢谢

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)
  }
}
1) 格式:-)

2) 签名:

我将省略convert部分,使累加器成为可选参数(函数用户不必提供仅用于内部实现的参数,对吗?)

现在它可以用作:

val str = toBinary(42)
有人可能会建议你拉皮条,这样的功能,所以调用可能看起来像

val str = 42.toBinary // btw, there is such function in std lib: 42.toBinaryString
但我看不到多少利润

另一件让我困扰的事情是,您正在为此使用List&mkString,为什么不使用StringBuilder呢?q和r是什么

最后一点——放置
@annotation.tailrec
,以确保即使在将来发生任何更改时,功能也会得到优化

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
尾部递归

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

这个问题可能更适合于你;首先,它将随着
n=0永远旋转
Your只为
Int
旋转。我刚刚为另一个执行此操作的线程添加了一个答案,它适用于
Boolean
Byte
Short
Char
Int
Long
。R代表余数,Q代表商。我应该使用Stringbuilder而不是List和mkstring。我的代码片段也不处理传入0的情况。您的代码片段只处理
Int
的情况,不包括前导零。我刚刚为另一个执行此操作的线程添加了一个答案,它适用于
Boolean
Byte
Short
Char
Int
Long
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
def toBinary(n: Int): String = n.toBinaryString
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)
}