2016-09-18 2 views
1

В настоящее время я пытаюсь написать метод, который преобразует десятичные числа в двоичный код в Ruby. Однако он должен работать без использования функции Ruby's .to_s(2), и он должен быть рекурсивным методом вместо цикла. Кроме того, первая цифра не может быть 0, но оно должно начинаться с 1. Ниже приведен код:Ruby рекурсивный десятичный двоичный метод

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%-на самом деле 1, но не все из них. Как я могу удалить первые 0 и заставить его работать?

+0

Обратите внимание, что вы можете удалить последнее утверждение, так как оно никогда не будет выполнено. Кроме того, вам не нужны никакие ключевые слова 'return'. Рассмотрим здесь инструкцию 'case':' case d; когда 0 - двоичный; когда 1 затем «1»; else двоичный + 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_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] в рекурсивном методе выше.