#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 }