0

繰り返さない文字列の順列を生成するRubyメソッドを書いているときに、これにつまずいた:

class String

  def permutations
    @result_array = []
    recurse( "", self.each_char.to_a )
    @result_array
  end

  def recurse( prepend_character, sub_array )
    sub_array.each{ |c|
      recurse( prepend_character + c, sub_array - [c] )
    }
    @result_array << prepend_character if sub_array.empty?
  end

end


p "abc".permutations # prints: ["abc", "acb", "bac", "bca", "cab", "cba"]

コアクラス内にアトリビュートを作成してデータを保持するのが適切か推奨かを考えていました。これを達成するために属性を作成しないようにするためのアイデアはありますか (グローバル変数を使用せずに)?

4

2 に答える 2

2

ロジックに加えることができる改善を無視して、不要なインスタンス変数や関数をクラスに追加せずにロジックを書き直す方法を次に示します。

class String
    def permutations
        result = []
        recurse = lambda do |pre, sub|
            sub.each { |c| recurse[pre + c, sub - [c]] }
            result << pre if sub.empty?
        end
        recurse['', each_char.to_a]
        result
    end
end

'abc'.permutations
于 2013-10-29T20:27:27.993 に答える