Генерировать двоичную строку из n бит в Ruby?

#ruby

#ruby

Вопрос:

Это программа для генерации двоичных строк из n бит.Я получаю неправильный результат, в котором в этом ответе есть некоторое дублирование.Я не мог понять, в чем проблема? Вот код:

 class GenString
    def initialize(n)
        @a = Array.new(n)
    end

    def binString(n)
        if n < 0
            @a.each_slice(3) { |a,b,c| puts [a,b,c]*'  '}
        else
            @a[n-1] = 0
            binString(n-1)
            @a[n-1] = 1
            binString(n-1)
        end
    end
end

gen = GenString.new(3)
gen.binString(3)
 

Результат:

введите описание изображения здесь

Я выделил повторяющиеся части.

Комментарии:

1. В чем заключается ваш вопрос?

2. Эта программа генерирует результат, повторяющий исходный результат, но я не мог понять, в чем проблема?

3. В чем заключается ваш вопрос?

4. Пожалуйста, найдите время, чтобы лучше отформатировать свой вопрос. Трудно читать, когда вы игнорируете правильную грамматику, что отвлекает / отпугивает потенциальных ответчиков.

Ответ №1:

Есть гораздо более простой способ генерировать двоичные строки:

 (0..7).each do |n|
  puts "b" % n
end
 

Вывод:

 000
001
010
011
100
101
110
111
 

Комментарии:

1. Спасибо, что оценили.

Ответ №2:

Проще говоря: потому что вы говорите ему печатать дважды.

Измените свое условие внутри #binString на if n < 1 , и оно будет работать нормально.

Посмотрите на эту идею: http://ideone.com/jjmTBh

Я только что заметил, что это выводит серию в обратном направлении. Вы можете поменять [a,b,c] [c,b,a] местами, чтобы компенсировать это. Я изменил ideone, чтобы отразить это.

Ответ №3:

Для более идиоматической версии Ruby я бы порекомендовал что-то вроде этого:

 def bin_string(n)
  (0..2**n-1).map { |i| "%0#{n}b" % i }
end
bin_string(3)
#=> ["000", "001", "010", "011", "100", "101", "110", "111"]
 

Если вы действительно хотите выводить напрямую (я бы не стал), измените тело метода на это:

 (0..2**n-1).each { |i| puts "%0#{n}b" % i }