Ruby Variation mit sich wiederholenden Verfahren Buggy
-
08-10-2019 - |
Frage
Ich brauche eine Methode in Ruby geschrieben, die Variationen berechnet. Ich habe es schon in Java geschrieben, aber wie ich bin neu zu Ruby gibt es nur etwas, das ich über die Ruby-Implementierung bin fehlt.
Das Verfahren ist suposed dies zu tun:
Verfahren (1 "01") => [ "0", "1"]
Verfahren (2, "01") => [ "00", "01", "10", "11"] ... so dass Sie die Idee.
Hinweis: in der Ruby-impl, ich gebe paralms wie folgt aus: Verfahren (2, [ "0", 1" ]), aber das ist kein Problem
.Meine Java impl:
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;
}
und es funktioniert gut. Aber das ist meine Ruby-Implementierung:
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
In dieser i erhalte Fehlermeldung test.rb: 10: in `Variation ':. Kann nicht gleich Null in String konvertieren (Typeerror)
Lösung
In Ruby-Arrays wächst automatisch je nach Bedarf. So aus dem Array Initialisierung ändern:
array = Array.new(arrayOfString.size**strength)
array = []
Um jedes Zeichen in einer Zeichenkette aufzählen über, anstelle von
for i in arrayOfString do
Sie folgendermaßen vor:
arrayOfString.each_char do |i|
Das Endergebnis:
#!/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"]
ist each_char in Ruby> = 1.8.7, oder Sie können es von der updates gem zu bekommen.