Ruby Variation avec la méthode de répétition poussette
-
08-10-2019 - |
Question
Je besoin d'une méthode écrite en Ruby, qui calcule variations. Je l'ai déjà écrit en Java, mais comme je suis nouveau à Ruby, il y a quelque chose qui me manque sur l'application Ruby.
La méthode est suposed à faire:
Procédé (1 "01") => [ "0", "1"]
méthode (2, "01") => [ "00", "01", "10", "11"] ... donc vous voyez l'idée.
Note: dans le Ruby impl, je donne paralms comme ceci: méthode (2, [ "0", 1" ]), mais ce n'est pas un problème
.Mon 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;
}
Et il va bien de travail. Mais ceci est ma mise en œuvre 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
Dans ce que je continue à recevoir test.rb message d'erreur: 10: `Variation '. Ne peut pas convertir en nil String (de TypeError)
La solution
Dans Ruby, les tableaux automatiquement au besoin grandir. Donc, changer votre initialisation de tableau à partir de:
array = Array.new(arrayOfString.size**strength)
à
array = []
Enumérer sur chaque caractère dans une chaîne, au lieu de
for i in arrayOfString do
faire ceci:
arrayOfString.each_char do |i|
Le résultat final:
#!/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"]
each_char est en Ruby> = 1.8.7, ou vous pouvez l'obtenir à partir de la pierre précieuse backports .