2016-09-18 86 views
1

我目前正在嘗試編寫一個方法,在Ruby中將十進制數轉換爲二進制。但是,它應該不使用Ruby的.to_s(2)函數,它應該是遞歸方法而不是循環。此外,第一個數字不能是0,但它應該從1下面開始是代碼:紅寶石遞歸十進制到二進制方法

def to_binary(d) 
    binary = (d % 2).to_s 
    if d == 0 
    return binary 
    elsif d == 1 
    return 1.to_s 
    else 
    return binary = binary + to_binary(d/2).to_s 
    end 
    return binary.to_i 
end 

它似乎得到正確大多數情況下,當第一d%2實際上是1,但不是所有的人。我如何刪除第一個0並使其工作?

+0

請注意,您可以刪除最後一條語句,因爲它永遠不會被執行。另外,你不需要任何'return'關鍵字。考慮在這裏使用'case'語句:'case d;當0則二進制;當1則爲「1」時; else binary + to_binary(d/2).to_s; end'。 –

回答

0

該算法是正確的,您只需按錯誤的順序追加數字。遞歸調用更改爲這條線,它應該工作:

return binary = to_binary(d/2).to_s + binary 
+0

非常感謝,它的工作原理。你介意解釋一下邏輯,因爲第一個數字不應該是d%2,那麼d/2%2等等。現在對我來說,它看起來像數字是相反的順序? –

+0

'd%2'是最後一位數字。 – user000001

0

我想你想的整數轉換成二進制數的字符串表示。編寫遞歸方法的另一種方法如下。

def to_binary(d, str='') 
    d.zero? ? str : to_binary(d/2, str.insert(0, (d%2).to_s)) 
end 

to_binary(3) 
    #=> "11" 
to_binary(8) 
    #=> "1000" 
to_binary(513246) 
    #=> "1111101010011011110" 

如果該方法不需要遞歸你可以使用Fixnum#bit_lengthFixnum#[]

def to_binary(d) 
    (d.bit_length-1).downto(0).with_object('') { |i,s| s << d[i].to_s } 
end 

你可以在上面的遞歸方法與d[0]替換d%2