我目前正在尝试编写一种在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 :(得分:0)
算法正确,您只需按错误的顺序追加数字。将递归调用更改为此行,它应该起作用:
return binary = to_binary(d/2).to_s + binary
答案 1 :(得分: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_length和Fixnum#[]:
def to_binary(d)
(d.bit_length-1).downto(0).with_object('') { |i,s| s << d[i].to_s }
end
您可以在上面的递归方法中将d%2
替换为d[0]
。