2015-06-08 18 views
5

Tôi cần gọi hàm sau cross 4 lần, cho tất cả các hoán vị của biến số xy với giá trị 1 và -1;iterate trough tất cả hoán vị của hai biến

cách tiếp cận của tôi:

var p = [-1, 1]; 

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

Có cách nào ngắn hơn để làm điều này?

+0

Tôi nghĩ rằng có một thuật toán để tạo ra n^2 kết hợp hiệu quả hơn n^2. – ssube

+3

Bởi ngắn hơn bạn có nghĩa là trong dòng mã hoặc trong thời gian (hiệu quả hơn)? –

+0

cả hai sẽ là thú vị. –

Trả lời

1

Có một số chi phí khi gọi một hàm. ví dụ. đặt con trỏ trả về trên ngăn xếp. Nó có lẽ sẽ nhanh hơn một chút để sử dụng hai vòng lặp thay vì gọi lại cho 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]); 
    } 
} 
2

Vì bạn biết độ dài của mảng p bạn không cần vòng lặp. Giải pháp nhanh nhất sẽ là:

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

lý do bỏ phiếu xuống? – bhspencer

+2

đây là giải pháp rõ ràng nhất cho trường hợp cụ thể, được bình chọn! –

+0

tại sao bạn sử dụng '0' thay vì' -1'? – naomik

3

Nếu bạn muốn được thêm chức năng, bạn có thể sử dụng map và sau đó reduce các mảng thành một. Tôi không nghĩ rằng nó sẽ nhất thiết phải hiệu quả hơn những gì bạn có bây giờ, cũng không đơn giản hơn nhiều (nó có chức năng hơn, chỉ một chút).

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>

tôi thực sự không nghĩ rằng có một thuật toán với hơn n^2 hiệu quả để sản xuất n^2 kết hợp.

1

này sẽ nhanh hơn:

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

nhưng nó ngắn hơn?

+2

và có thể đọc được không? –

Các vấn đề liên quan