【发布时间】:2011-10-02 22:45:41
【问题描述】:
我编写了以下代码来生成一些数字的所有可能组合:
let allCombinations (counts:int[]) =
let currentPositions = Array.create (counts.Length) 0
let idx = ref (counts.Length-1)
seq{
while currentPositions.[0]<counts.[0] do
yield currentPositions
currentPositions.[!idx]<-currentPositions.[!idx]+1
while currentPositions.[!idx] >= counts.[!idx] && !idx>=1 do
currentPositions.[!idx]<-0
idx:=!idx-1
currentPositions.[!idx]<-currentPositions.[!idx]+1
idx:=counts.Length-1
}
我正在像这样在程序的其他部分使用序列:
allCombinations counts |> Seq.map (fun idx -> buildGuess n digitsPerPos idx) ...
到目前为止一切顺利。程序按预期运行并生成组合。对于输入 [|2;2;2|],它会生成八个值:
[|0; 0; 0|]
[|0; 0; 1|]
[|0; 1; 0|]
[|0; 1; 1|]
[|1; 0; 0|]
[|1; 0; 1|]
[|1; 1; 0|]
[|1; 1; 1|]
但是,当我使用 PSeq 并行化生成的序列时,所有要消耗的值都会更改为 [|2;0;0|],这是上面 while 循环中 currentPositions 数组的最后一个值。
如果我使用
yield (currentPositions|>Array.copy)
而不是
yield currentPositions
在顺序和并行版本中一切正常。
为什么会这样;是否有最有效的方法来产生结果?提前谢谢你;
【问题讨论】: