迭代两个变量的所有排列

时间:2015-06-08 16:45:25

标签: javascript

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

我的方法:

var p = [-1, 1];

p.forEach(function(x) {
  p.forEach(function(y) {
    cross(x, y);
  });
});

有没有更短的方法呢?

4 个答案:

答案 0 :(得分:3)

如果您希望功能更强大,可以使用map然后将reduce数组合并为一个。我认为它不一定比你现在的效率更高,也不是更简单(它更具功能性,只是略微)。



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>
&#13;
&#13;
&#13;

我真的不认为有一种效率优于n ^ 2的算法可以产生n ^ 2种组合。

答案 1 :(得分:2)

由于您知道数组p的长度,因此不需要循环。最快的解决方案是:

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

答案 2 :(得分: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]);
    } 
}

答案 3 :(得分:1)

这会更快:

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

但它更短了吗?