迭代两个变量的所有排列

iterate through all permutations of two variables

本文关键字:排列 变量 两个 迭代      更新时间:2023-09-26

对于值为1和-1的xy变量的所有排列,我需要调用以下函数cross 4次;

我的方法:

var p = [-1, 1];
p.forEach(function(x) {
  p.forEach(function(y) {
    cross(x, y);
  });
});

有更短的方法吗?

如果您想要额外的功能,您可以将mapreduce数组合并为一个。我不认为它一定会比你现在的更有效率,也不会更简单(它更实用,只是稍微)。

var d = [-1, 1];
var r = d.reduce(function(p, x) {
  return p.concat(d.map(function(y) {
    return cross(x, y);
  }));
}, []);
document.getElementById('r').textContent = JSON.stringify(r);
<pre id=r></pre>

我真的不认为有比n^2效率更好的算法产生n^2组合

既然知道数组的长度,就不需要循环了。最快的解决方案是:

var p = [-1, 1];
cross(p[0], p[0]);
cross(p[0], p[1]);
cross(p[1], p[0]);
cross(p[1], p[1]);

调用函数有一些开销。例如,将返回指针放在堆栈上。使用两个for循环可能比回调forEach要稍微快一些。

var p = [-1, 1];
for (var x = 0; x < p.length; x++) {
    for (var y = 0; y < p.length; y++) {
        cross(p[x], p[y]);
    } 
}

这样会更快:

for (var n = 0; n < 4; ++n) 
     cross(n & 2 ? 1:-1, n & 1 ? -1:1);

但是它更短吗?