如何微调地图功能,避免使用展平

时间:2012-08-05 19:44:00

标签: ruby algorithm functional-programming permutation

我有以下代码列出给定字符串的所有可能的排列。但由于我的笨拙列表(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 个答案:

答案 0 :(得分:2)

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

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

将字符串组件拆分为数组;得到数组的所有排列;将这些连接成字符串;杂草重复。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:1)

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

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