1

我有以下代码列出给定字符串的所有可能排列。但由于我笨拙的列表(ruby 数组)操作和函数式编程知识有限,我不得不使用 flatten 来获取结果数组。这几乎是一个黑客。如何重构代码并避免使用(滥用)扁平化?

class String
  def remove_char_at(i)
    if i==0
      self[1..-1]
    else
      self[0..i-1] + self[i+1..-1]
    end
  end
end

def permute(str,prefix="")

  if str.size==0
    prefix
  else
    str.chars.each_with_index.map do |s,i|
        permute(str.remove_char_at(i),prefix+s)
    end.flatten
  end

end
4

4 回答 4

2
class String
  def remove_char_at(i)
    if i==0
      self[1..-1]
    else
      self[0..i-1] + self[i+1..-1]
    end
  end
end

...可以通过使用而不是重构如下..

class String
  def remove_char_at(i)
    self[0...i] + self[i+1..-1]
  end
end
于 2012-08-06T23:30:41.457 回答
2

您可以在SICP的第一章中找到有关函数式编程的有趣内容

def permute2(str,prefix="")

  if str.size==0
    [prefix] #revise for concatenate with memo
  else
    str.chars.each_with_index.inject([]) do |memo, ary|
        s = ary[0]
        i = ary[1]
        memo += permute2(str.remove_char_at(i),prefix+s) #memoize
    end
  end

end
于 2012-08-06T09:30:38.147 回答
2

Ruby 已经为您完成了许多艰苦的工作。要获取字符串 myString 的所有排列,请执行以下操作:

myString.split('').permutation.map(&:join).uniq

这会将字符串组件拆分为一个数组;获取数组的所有排列;将它们重新连接成字符串;清除重复项。

于 2012-08-05T19:54:32.947 回答
1

我专门回答了如何重构代码并避免使用(滥用)扁平化?部分:

您可以使用1.9.2 中引入的flat_map而不是map+ 。flatten

于 2012-08-06T21:31:30.040 回答