我正在尝试编写一个算法来获取 JavaScript 中矩阵的所有可能变化。 这是我想要实现的目标:
blue,red male,female,other small,medium,large ----------------- blue,male,small blue,male,medium blue,male,large blue,female,small, blue,female,medium, blue,female,large blue,other,small, blue,other,medium, blue,other,large red,male,small red,male,medium red,male,large red,female,small, red,female,medium, red,female,large red,other,small, red,other,medium, red,other,large
知道如何做到这一点吗?
最佳答案
你想要的是几个列表的笛卡尔积。如果您有一组固定的列表,则嵌套循环是生成笛卡尔积的简单方法。
您可以通过以里程计样式迭代列表来将其推广到任意列表。 (不过,里程表的每个数字可能有不同的范围。)
方法如下:
function cartesian(m) {
const res = [];
const index = []; // current index
const max = []; // length of sublists
for (let i = 0; i < m.length; i++) {
index.push(0);
max.push(m[i].length);
}
for (;;) {
res.push(index.map((i, j) => m[j][i]));
let i = 0;
index[i]++;
while (index[i] == max[i]) {
index[i] = 0;
i++;
if (i == m.length) return res;
index[i]++;
}
}
}
这样调用它:
const m = [
["blue", "red"],
["male", "female", "other"],
["small", "medium", "large"],
];
const p = cartesian(m);
这会创建一个包含所有可能性的巨大列表,这可能并不理想。您可以通过对每种可能性执行任何您想要执行的操作来更改函数,其中上面的代码将当前列表推送到结果数组。上面的代码更改了每次迭代中的第一项,这与您在帖子中显示的内容相反。
关于javascript - 矩阵的所有变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60954678/