我在F#中实现了一个标准的可变原地排列算法(如果有类似的内置方式,我将非常感激提供的信息):
let permutations f (alphabet:'a array) =
let swap i j =
let aux = alphabet.[i]
alphabet.[i] <- alphabet.[j]
alphabet.[j] <- aux
let rec permutations' n =
if n = alphabet.Length
then f alphabet
else
for i in n..(alphabet.Length-1) do
swap n i
permutations' (n+1)
swap n i
permutations' 0
虽然该函数非常多才多艺,但我想知道在F#中是否有一种实现包装器函数的方法,可以将发现的项作为序列产生。类似于以下(不正确)的F#方法:
let permutations_seq (alphabet:'a array) =
seq {
permutations (fun arr -> yield arr.Clone()) alphabet
}
在
permutations
函数中,我不想直接使用 yield
,因为我希望保持该函数的通用性,而且我也不想客户端总是为数组克隆付出代价。您会如何处理?
permutations
不能产生未克隆的数组?这样,用户就可以决定他想要做什么。 - svick