2

バリエーションを計算するRubyで書かれたメソッドが必要です。私はすでにJavaで作成しましたが、Rubyを初めて使用するため、Rubyの実装について欠けている点があります。

メソッドはこれを行うと想定されています:
method(1、 "01")=> ["0"、 "1"]
method(2、 "01")=> ["00"、 "01"、 "10"、 "11"]...だからあなたはアイデアを得る。

注:Ruby implでは、次のようなパラメーターを指定します:method(2、["0"、1"])が、それは問題ではありません。

私のJavaimpl:

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:in `Variation'を受け取り続けます:nilを文字列に変換できません(TypeError)。

4

1 に答える 1

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>=1.8.7であるか、バックポートgemから取得できます。

于 2010-12-04T14:38:17.627 に答える