Ruby Variation与重复的buggy方法

时间:2010-12-04 14:19:40

标签: java ruby variations

我需要一个用Ruby编写的方法,它可以计算变体。我已经用Java编写了它,但是因为我是Ruby的新手,所以我只缺少关于Ruby实现的东西。

该方法是这样做的:
方法(1,“01”)=> [“0”,“1”]
方法(2,“01”)=> [“00”,“01”,“10”,“11”] ......所以你明白了。

注意:在Ruby impl中,我给出了这样的副词:method(2,[“0”,1“]),但这不是问题。

我的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;
}

它工作正常。但这是我的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:在`Variation'中:无法将nil转换为String(TypeError)。

1 个答案:

答案 0 :(得分:2)

在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"]

each_char在Ruby&gt; = 1.8.7中,或者你可以从backports gem获得它。