【问题标题】:Ruby recursive decimal to binary methodRuby递归十进制到二进制方法
【发布时间】:2017-01-26 02:31:42
【问题描述】:

我目前正在尝试编写一种在 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 并使其正常工作?

【问题讨论】:

  • 请注意,您可以删除最后一条语句,因为它永远不会被执行。此外,您不需要任何 return 关键字。考虑在此处使用case 语句:case d; when 0 then binary; when 1 then "1"; else binary + to_binary(d/2).to_s; end

标签: ruby recursion binary decimal


【解决方案1】:

算法是正确的,你只是以错误的顺序附加数字。将递归调用更改为此行,它应该可以工作:

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

【讨论】:

  • 非常感谢,它有效。您介意解释一下逻辑吗,因为第一个数字不应该是 d % 2,然后是 d/2 % 2 等等。现在在我看来,数字的顺序是相反的?
  • d % 2 是最后一个数字。
【解决方案2】:

我假设您希望将整数转换为二进制数字的字符串表示形式。编写递归方法的另一种方法如下。

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%2 替换为d[0]

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2014-12-05
    • 2016-01-17
    • 2016-06-27
    • 2014-04-18
    • 1970-01-01
    相关资源
    最近更新 更多