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