Ruby Variation с повторением багги
-
08-10-2019 - |
Вопрос
Мне нужен метод, написанный в Ruby, который вычисляет вариации. Я уже написал это в Java, но, как я новичок, чтобы Ruby, есть просто то, что я скучаю о реализации Ruby.
Метод должен сделать это:
Метод (1, «01») => [«0», «1»
Метод (2, "01") => ["00", "01", "10", "11"] ... Итак, вы получаете идею.
ПРИМЕЧАНИЕ. В RUBY INMUM я даю паральмам, как это: метод (2, [«0», 1 "]), но это не проблема.
Моя Java Impro:
public static List<String> Variations(int strength, String usableChars) {
List<String> list =
new ArrayList<String>((int) Math.pow(usableChars.length(), strength));
if (strength == 0) {
list.add("");
} else {
List<String> l = Variations(strength - 1, usableChars);
for (char c : usableChars.toCharArray()) {
for (String s : l) {
list.add(c + s);
}
}
}
return list;
}
И это работает нормально. Но это моя реализация Ruby:
def Variation (strength, arrayOfString)
array = Array.new(arrayOfString.size**strength)
if strength == 0
array << ""
else
a = Variation(strength-1, arrayOfString)
for i in arrayOfString do
for j in a do
array << (i + j)
end
end
end
return array
end
В этом я продолжаю получать сообщение об ошибке Test.RB: 10: в «варианте»: не может преобразовать NIL в String (TypeError).
Решение
В Ruby массивы растут автоматически по мере необходимости. Так что измените свой массив инициализации из:
array = Array.new(arrayOfString.size**strength)
к
array = []
Перечислять каждый символ в строке вместо
for i in arrayOfString do
сделай это:
arrayOfString.each_char do |i|
Конечный результат:
#!/usr/bin/ruby1.8
def Variation (strength, arrayOfString)
array = []
if strength == 0
array << ""
else
a = Variation(strength - 1, arrayOfString)
arrayOfString.each_char do |i|
for j in a do
array << (i + j)
end
end
end
return array
end
p Variation(2, '01') # => ["00", "01", "10", "11"]
Cover_char находится в Ruby> = 1.8.7, или вы можете получить его из Backports Gem..