您将使用哪种方法来生成仅包含零和代表所有可能的不同组合的NxN矩阵集?
let matrix Array2D.init N N (fun x y -> something)
如果您不知道F#,那么伪代码也将是一个贡献。
所以我想要的是所有不同矩阵组合的列表/数组
答案 0 :(得分:2)
因此,我认为最困难的部分是生成元素列表。我们可以递归进行。
基本情况很容易。对于1x1矩阵,您有1个元素,只能有两个组合:[|[|0|]; [|1|]|]
。
对于2x2元素,我们有2 ^ 2 = 4个元素。这些中的每一个可以是1或0,因此可能有2 ^ 4 = 16种组合。要获得此2x2数组的所有可能组合,我们可以将其视为长度为4的数组。
但是首先,让我们考虑一个长度为2的数组。然后,我们必须找到[|[|0|]; [|1|]|]
和[|[|0|]; [|1|]|]
之间的所有组合。这将是[|[|0; 0|]; [|0;1|]; [|1;0|]; [|1; 1|]|]
。幸运的是,有一个名为Array.allPairs
的函数将生成两个数组之间所有可能组合的数组,这已经为我们做到了!
因此,我们可以将Array.allPairs
依次应用于长度为4的数组的每个元素,以使用Array.reduce
获得整个矩阵的所有可能组合。我创建了一个名为pairsToArray
的函数,以基本扁平化数据结构。
let pairsToArray x = Array.concat [|fst x; snd x|]
let rec binary N =
match N with
| 0 -> [||]
| 1 -> [|[|0|]; [|1|]|]
| n -> let elements = n*n
let combinations = Array.init elements (fun i -> binary 1)
let result = Array.reduce (fun acc i -> Array.allPairs acc i |> Array.map pairsToArray) combinations
result
现在,所有剩余的内容都将其转换为Array2D
。
应该可以解决问题的
let c = binary 2
c |> Array.map (fun i -> Array2D.init 2 2 (fun j k -> i.[j+k*2]))
对于2x2情况
答案 1 :(得分:0)
也许是这样
let rec addOne (N1: int, N2: int) (M: int[,]) (i: int, j: int)=
if M.[i,j] = 0
then M.[i,j] <- 1
true
else M.[i,j] <- 0
let newi, newj =
if i < N1-1
then (i+1,j)
else (0,j+1)
if newj = N2
then false
else addOne (N1, N2) M (newi,newj)
与此结合
let N = 3
let M: int[,] = Array2D.zeroCreate N N
let mylist =
[ yield M;
while addOne (N,N) M (0,0)
do yield Array2D.copy M ]
我不知道这是否有意义。 这是一种找到“下一个”矩阵,然后列出以此方式遇到的所有矩阵的方法。
编辑:用int(0和1)替换bool以更好地适合原始问题。