对于cross
和x
变量的值为1和-1的所有排列,我需要调用以下函数y
4次;
我的方法:
var p = [-1, 1];
p.forEach(function(x) {
p.forEach(function(y) {
cross(x, y);
});
});
有没有更短的方法呢?
答案 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;
我真的不认为有一种效率优于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);
但它更短了吗?