2014-04-06 46 views
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

的問題可能會更適合http://codereview.stackexchange.com/;一兩件事,它會與'N = 0' –

回答

1

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) 

有人可能建議你皮條客這樣的功能,所以調用可能看起來像

val str = 42.toBinary // btw, there is such function in std lib: 42.toBinaryString 

但我看不到太多的利潤。

困擾我的另一件事是,您正在使用List & mkString爲此目的,爲什麼不是StringBuilder?什麼是q和r?

和最終輕微點 - 地方@annotation.tailrec,以確保功能,即使在未來的情況下進行優化改變

+0

R是對於剩餘部分,且Q表示商永遠自旋。我應該使用Stringbuilder而不是List和mkstring。我的代碼片段也不處理傳入0的情況。 –

2

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 
4
def toBinary(n: Int): String = n.toBinaryString 
0

尾遞歸

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