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 回答
1

如果您不了解您的工具,则不应更改核心类。这只能由确切知道发生了什么的人来完成。

所以我的建议是:在你真的需要之前不要这样做。

核心 Ruby 中几乎所有内容都有解决方案:

"abc".split('').permutation.map(&:join)
=> ["abc", "acb", "bac", "bca", "cab", "cba"]
于 2013-10-29T19:40:55.630 回答